多播委托实现Observer模式:
前言:
我们在知道了什么是委托之后,就要考虑一下他的用途,比如我们本次要探究的就是如何使用多播委托实现Observer模式?首先我们对于观察者模式肯定是不陌生的了,我们首先要知道的是什么是观察者模式,记得曾经一个老师曾经和我们讲这个观察者模式的时候讲了一个故事,如今我套用一下:从前山里有一户人家,养了一条狗,某一天的夜里,突然来了一伙强盗准备入室抢劫,但是还好这户人家养的狗即使发现狂吠不止惊醒了人家,他们及时撤退这才能够幸免。这个故事就是一个很好的观察者的例子,首先在我的理解,观察者模式要具备三个要素,首先是观察者,被观察者,事件。缺一不可,这个故事中,狗就是观察者,人家就是被观察者,“强盗来了”就是事件,当发生这样的事件的时候观察者就会发出“狗吠”这样的行为。
简单的代码实现:
其实这种观察者模式从狭义的层面来说不借助委托模式也是可以实现的,那么我们可以怎么实现呢?
//
public int DangerNum {
get { return DangerNum; }
set {
if (value != DangerNum) {
DangerNum = value;
foreach (var obser in DogObersverList) {
obser.wangwangwang();
}
}
}
}
//观察者集合
List<LookDoorDog> DogObersverList=new List<LookDoorDog>();
}
//观察者的实现
public class Dog1 : LookDoorDog{
public void wangwangwang()
{
Console.WriteLine("看门狗一号,汪汪汪");
}
}
//观察者的实现
public class Dog2 : LookDoorDog
{
public void wangwangwang()
{
Console.WriteLine("看门狗二号,汪汪汪");
}
}
//自己定义的观察者的接口
public interface LookDoorDog {
void wangwangwang();
}
通过这样的代码我们也能实现一个简陋的观察者模式,但是这种实现模式虽然使用了接口,但是还是属于硬编码的模式,很难进行扩展,而且最重要的原因是我们需要扩展的时候就需要写大量的接口进行大量的实现,容易引起类的爆炸,所以我们才会使用多播委托进行观察者的实现:
pbulic class Family{
public int HaveBadMan {
get { return HaveBadMan; }
set {
if (value !=HaveBadMan) {
HaveBadMan = value;}
}
}
public Action Observers { get; set; }
}
public class observer1 {
public void Dog1() {
Console.WriteLine("狗子一号,汪汪汪!!");
}
}
public class observer2
{
public void Dog2()
{
Console.WriteLine("狗子二号,汪汪汪!!");
}
}
public static void Main()
{
Observer2 observer2 = new Observer2();
observer2 o2 = new observer2();
observer1 o1 = new observer1();
observer2.Observers += o1.Dog1; //注册观察者
observer2.Observers += o2.Dog2;
observer2.HaveBadMan = 2; //触发事件完成调用
}
这样也就简单的实现了一个多播委托的观察者模式。
我的看法
后面我们会学习到在c#中事件是怎么回事,其实所有的事件都是基于这种观察者模式进行实现的。万变不离其宗,以上就是我对于观察者模式以及多播委托的理解,希望大家的批评指正!!!