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)进行解析和操作。修改时需谨慎,并备份原始文件。
