本文摘自PHP中文网,作者黄舟,侵删。
订阅-分发模式,又叫观察者模式,那么这种模式它的实现机理是什么?它该如何在产品开发中实际应用呢? 我们学一种模式,最好不要死板的去学它,可以分布根据业务的需求将伪代码逐渐转化为真正的代码。自己画画图,编编码,体会这种机制,这样完全实践一遍后,才能真正用于以后的产品开发中。写完后,画的类图:

首先,通过名字看出,得先订阅,然后,等到发送人,或者叫主办方,写好东西后,比如一篇体育新闻,最新热点,点击发送,这样会发送给所有订阅这个节目的人。
那么,我们看到这个关系是典型的一对多的关系,比如一是指主办单位,多是指那些订阅了这个报刊的个人,可能是10几个,或者成千上百个。这么些订阅人中,可能一类是体育迷,一类是官场混的。
因此,我们首先建一个主办方的模型:
还得有想订阅这些报刊的人的模型:
1 2 3 4 5 6 | public class Receiver
{
private string _name; private Subject _sub; public Receiver( string name, Subject sub)
{ this ._name = name; this ._sub = sub;
}
}
|
并且,注意此处,订阅报刊的人可能有多个呢!所有建立一个订阅这些报刊的人的集合类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 的模型为:
1 2 3 4 5 6 | public class Subject
{
public string Topic { get ; set ;}
public string SubAbstract { get ; set ;}
public string Content { get ; set ;}
}
|
各个对象模型及各自的行为都写好后,我们就可以使用这些对象了。
首先,主办方定义了两个主题,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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事件触发时,回调搭载的各类订阅人收到主题后的行为,比如说看到主题今晚国足有比赛后,郝海东会看比赛。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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个订阅者
确定主办方发送后,订阅者的行为,这里采取先注册,后发送主题后,回调的方式,触发订阅者的行为:
1 2 | sender.UpdateEvent += new MyEventHandler(rece.WillDo);
|
主办方开始发送主题给订阅者:
这样,收到主办方发送的消息后,订阅人回调他们的WillDo的方法,这样整个订阅-分发-回调的过程就闭合了!!!
以上就是C#设计模式-观察者模式的另类的示例代码总结的详细内容!
相关阅读 >>
C# 2.0 specification(一)简介
C#和c ++的区别是什么
C#语言为什么用的人很少
C#中字符串的一般性和特殊性具体介绍(图文)
实现C#遍历文件夹及子目录下所有图片的示例代码分享
教你用C#制作最简单的登录界面
C#动态对象dynamic实现方法和属性动态代码详解
C#和.net是一个东西吗?C#与.net的区别与联系
C# 使用npoi生成word文档(按照模板)
详解C#把unicode编码转换为gb编码的示例代码
更多相关阅读请进入《C#》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C#设计模式-观察者模式的另类的示例代码总结