C#設計模式-觀察者模式的另類的範例程式碼總結
訂閱-分發模式,又叫觀察者模式,那麼這種模式它的實作機制是什麼?它該如何在產品開發上實際應用呢? 我們學一種模式,最好不要死板的去學它,可以分佈根據業務的需求將偽代碼逐漸轉化為真正的代碼。自己畫畫圖,編編碼,體會這種機制,這樣完全實踐一遍後,才能真正用於以後的產品開發。
寫完後,畫的類別圖:

#首先,透過名字看出,得先訂閱,然後,等到發送人,或者叫主辦方,寫好東西後,比如一篇體育新聞,最新熱點,點擊發送,這樣會發送給所有訂閱這個節目的人。
那麼,我們看到這個關係是典型的一對多的關係,比如一是指主辦單位,多是指那些訂閱了這個報刊的個人,可能是10幾個,或成千上萬個。這麼些訂閱人中,可能一類是體育迷,一類是官場混的。
因此,我們先建立一個主辦方的模型:
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; } } }
好了,我們有了主辦方對象的架子,訂閱人對象,訂閱人集合對象,用來管理訂閱人。一對多的模型架已經架起來了,接下來,我們該實作這些物件各自的行為了!
我們知道,主辦單位要在分發之前,就得掌握需要分發給哪些人,除了知道給誰發之外,主辦方還要想好稿子,也就是發佈內容或主題完成後,下一步,把內容或主題寄給所有的訂閱人!
那麼主辦單位的這個行為,兌現為程式碼,是怎麼樣的呢?在已有架子的基礎上,修改
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; }
分發主題Subject 的模型為:
public class Subject { //主题话题 public string Topic {get;set;} //主题摘要 public string SubAbstract {get;set;} //主题内容 public string Content {get;set;} }
各個物件模型及各自的行為都寫好後,我們就可以使用這些物件了。
首先,主辦單位定義了兩個主題,
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

可以採用多種方法修改 XML 格式:使用文本編輯器(如 Notepad )進行手工編輯;使用在線或桌面 XML 格式化工具(如 XMLbeautifier)進行自動格式化;使用 XML 轉換工具(如 XSLT)定義轉換規則;或者使用編程語言(如 Python)進行解析和操作。修改時需謹慎,並備份原始文件。
