订阅-分发模式,又叫观察者模式,那么这种模式它的实现机理是什么?它该如何在产品开发中实际应用呢? 我们学一种模式,最好不要死板的去学它,可以分布根据业务的需求将伪代码逐渐转化为真正的代码。自己画画图,编编码,体会这种机制,这样完全实践一遍后,才能真正用于以后的产品开发中。
写完后,画的类图:
首先,通过名字看出,得先订阅,然后,等到发送人,或者叫主办方,写好东西后,比如一篇体育新闻,最新热点,点击发送,这样会发送给所有订阅这个节目的人。
那么,我们看到这个关系是典型的一对多的关系,比如一是指主办单位,多是指那些订阅了这个报刊的个人,可能是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#设计模式-观察者模式的另类的示例代码总结的详细内容。