サブスクリプション分散モデルは、オブザーバー モデルとも呼ばれます。では、このモデルの実装メカニズムは何でしょうか?実際の商品開発にどう活かすことができるのでしょうか? パターンを学習するときは、それを厳密に学習するのではなく、ビジネス ニーズに基づいて疑似コードを実際のコードに徐々に変換することが最善です。この仕組みを実際に絵を描いて、コードを書いて体験して、しっかりと実践して初めて、今後の製品開発に活かすことができます。
書き終わったら、クラス図を描きます:
まず、名前からわかるように、最初に購読し、送信者が届くまで待つ必要があります。主催者がスポーツニュースや最新スポットなどを書き、クリックして送信します。これはこの番組を購読しているすべての人に送信されます。
つまり、この関係は典型的な 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 サイトの他の関連記事を参照してください。