ホームページ バックエンド開発 C#.Net チュートリアル C# 設計パターン - オブザーバー パターンの代替サンプル コードの概要

C# 設計パターン - オブザーバー パターンの代替サンプル コードの概要

Mar 18, 2017 pm 01:28 PM

サブスクリプション分散モデルは、オブザーバー モデルとも呼ばれます。では、このモデルの実装メカニズムは何でしょうか?実際の商品開発にどう活かすことができるのでしょうか? パターンを学習するときは、それを厳密に学習するのではなく、ビジネス ニーズに基づいて疑似コードを実際のコードに徐々に変換することが最善です。この仕組みを実際に絵を描いて、コードを書いて体験して、しっかりと実践して初めて、今後の製品開発に活かすことができます。

書き終わったら、クラス図を描きます:


C# 設計パターン - オブザーバー パターンの代替サンプル コードの概要


まず、名前からわかるように、最初に購読し、送信者が届くまで待つ必要があります。主催者がスポーツニュースや最新スポットなどを書き、クリックして送信します。これはこの番組を購読しているすべての人に送信されます。

つまり、この関係は典型的な 1 対多の関係 であることがわかります。たとえば、1 つは主催者を指し、ほとんどはこの新聞を購読している個人を指します (10 人以上になる可能性があります)。または数千または数百。これらの購読者の中には、1 人はスポーツファン、もう 1 人は政府関係者である可能性があります。

そこで、最初に主催者のモデルを構築します:

public class Sender 
{   //主办方,此处称为消息发送者}
ログイン後にコピー

また、これらの新聞や定期刊行物を購読したい人々のモデルも必要です:

public class Receiver 
{   //订阅报刊的人,此处称为接受者
   private string _name;   private Subject _sub;   public Receiver(string name, Subject sub)
   {       this._name = name;       this._sub = sub;    
   }
}
ログイン後にコピー

そして、ここで注意してください、購読している人が複数いる可能性があります新聞や雑誌に!これらはすべて、これらの新聞や定期刊行物を購読する人々のコレクション クラスを作成します。

public class ReceiverCollection
{   //这个集合维护着订阅报刊的人

   //封装一个订阅人的列表
   private List<Receiver> _receivers = new List<Receiver>();   public List<Receiver> ReceiverList
   {     get
     {       return _receivers;
      }
   }    //管理订阅人:增加一个订阅人,移除一个,统计人数
    public void AddReceiver(Receiver r)
    {       this._receivers.Add(r);
    }    public void RemoveReceiver(Receiver r)
    {       if(this._receivers.Contains(r))           this._receivers.Remove(r);       else 
          throw new ArgumentException("此人未订阅此报刊");
    }    public int ReceiverCount
    {       get
       {          return _receivers.Count;
       }
    }

}
ログイン後にコピー

さて、購読者を管理するためのオーガナイザー オブジェクト シェルフ、購読者オブジェクト、および購読者コレクション オブジェクトがあります。 1 対多のモデル シェルフが設定されました。次に、これらのオブジェクトのそれぞれの 動作 を実装する必要があります。

主催者は、配布する前に誰に配布する必要があるかを把握する必要があることを知っているだけでなく、コンテンツやテーマを公開した後も原稿について考える必要があります。次のステップは、コンテンツまたはトピックがすべての購読者に送信されることです。

では、主催者のこの行動はどのようにしてコード化されるのでしょうか?既存のシェルフに基づいて、

public class Sender 
{   //主办方,此处称为消息发送者

   //要知道分发给哪些人
   private ReceiverCollection _receColl;   public Sender(ReceiverCollection receColl)
   {     this._receColl = receColl;
   }   //主办方确定 分发主题
   public List<Subject> SendingSubjects {get; set;}   //主办方通知多个订阅人
    public void Notify()
    {       //执行更新事件
       UpdateEvent();
    }    //因此需要定义一个主办方在通知订阅人时,执行的更新事件
    //事件搭载各类订阅人在收到主题后的行为!!!
    //当事件触发时,回调搭载的各类订阅人收到主题后的行为!!!
    public delegate void MyEventHandler();    public event EventHandler UpdateEvent;
}
ログイン後にコピー

ディストリビューション テーマのサブジェクト モデルを次のように変更します。

public class Subject
{   //主题话题
   public string Topic {get;set;}   //主题摘要
   public string SubAbstract {get;set;}   //主题内容
   public string Content {get;set;}
}
ログイン後にコピー

各オブジェクト モデルとそれぞれの動作が記述された後、これらのオブジェクトを使用できます。

まず、オーガナイザーは 2 つのトピックを定義します。

            ReceiverCollection receColl = new ReceiverCollection();
            Sender sender = new Sender(receColl );
            Subject sportSubject = new Subject()
            {
                Topic = "Sport",
                SubAbstract = "篮球,足球,乒乓球",
                Content = "2018年俄罗斯世界杯,今天晚上国足迎来出线的关键争夺战!"
            };
            sender.SendingSubjects.Add(sportSubject);
            Subject newsSubject = new Subject()
            {
                Topic = "News",
                SubAbstract = "国内大事 国际纵横",
                Content = "十九大,即将召开,请前来参会!"
            };
ログイン後にコピー

はサブスクライバーの インターフェース を追加します。UpdateEvent イベントがトリガーされると、コールバックはトピックを受信した後の各タイプのサブスクライバーの動作を伝えます。 、今夜サッカー代表チームの試合があるというテーマを見た後、ハオ・ハイドンは試合を観戦します。

public interface IResponse
{    void WillDo();   
}public class SportsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I will watch tv tonight, good luck for gays"); 
   }  public SportsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}public class NewsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I am going to Beijing to meeting"); 
   }   public NewsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}
ログイン後にコピー

次にサブスクライバーを2人追加します

//添加一位体育大牛:郝海东receColl.AddReceiver(new SportReceiver("Hao Haidong", sender.newsSubjects[0]));
//添加县长:钱烈贤receColl.AddReceiver(new NewsReceiver("Qian Liexian", sender.newsSubjects[1]));
ログイン後にコピー

オーガナイザーが送信した後のサブスクライバーの動作を確認します。ここでは、最初に登録してからトピックを送信し、サブスクライバーの動作をトリガーするためにコールバックする方法を採用しています:

//要在此处注册订阅者看到消息后的反应foreach(var rece in receColl)
  sender.UpdateEvent += new MyEventHandler(rece.WillDo);
ログイン後にコピー

オーガナイザーが送信を開始します。サブスクライバーへのトピック:

sender.Notify();
ログイン後にコピー

このようにして、オーガナイザーによって送信されたメッセージを受信した後、サブスクライバーは WillDo メソッドをコールバックし、サブスクリプション配布コールバック プロセス全体が終了します。 ! !


以上がC# 設計パターン - オブザーバー パターンの代替サンプル コードの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

XMLの形式を変更する方法 XMLの形式を変更する方法 Apr 03, 2025 am 08:42 AM

XML形式を変更する方法はいくつかあります。Atepadなどのテキストエディターを使用して手動で編集する。 XmlBeautifierなどのオンラインまたはデスクトップXMLフォーマットツールを使用して自動的にフォーマットします。 XSLTなどのXML変換ツールを使用して変換ルールを定義します。または、Pythonなどのプログラミング言語を使用して解析および操作します。元のファイルを変更してバックアップするときは注意してください。

See all articles