5月初,我们三个小伙伴开始着手准备机房收费系统合作版,借此大好良机,我准备把设计模式写成一个博客专栏,站在一个更高的角度品味前人的思想精髓。设计模式分为三类--创建型、结构型、行为型,咱们就先从行为型模式--观察者模式开讲。
开讲之前,我先给大家讲个小故事,以便大家快速认识观察者模式。在战争年代,战争双方不时受到敌军飞机的轰炸,于是人们发明了航空警报,并派几个侦察兵放哨,一但敌机来临,立即拉响航空警报,这样所有的收听者就能听到报警逃跑。上述情节,看似平常,其实是观察者模式是完美体现。下图是针对上述情节的形象解说。
航空警报是个公共的接口,所有侦察兵实现了航空警报的接口,都有报警的功能。这样设计的好处是公民只需认真听航空警报是否报警即可,没必要知道是谁报的警。航空警报依赖于收听者,因为如果没有人收听,即时报警又有什么用呢?
说到这,思想大家应该都能领悟了,但具体该如何实现呢?下面是对上图的代码实现。
航空警报代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式
{
interface 航空警报
{
void 增加(收听者 listener);
void 减少(收听者 listener);
void 报警();
}
}
侦察兵A代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式
{
class 侦察兵A:航空警报
{
private IList<收听者> listeners = new List<收听者>();
public void 增加(收听者 listener)
{
listeners.Add(listener);
}
public void 减少(收听者 listener)
{
listeners.Remove(listener);
}
public void 报警()
{
foreach (收听者 listener in listeners)
{
listener.逃跑();
}
}
}
}
侦察兵B与侦察兵A功能相同,所以代码基本一样,在此不再赘述。
收听者代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式
{
abstract class 收听者
{
protected 航空警报 airalert;
public 收听者(航空警报 airalert)
{
this.airalert = airalert;
}
public abstract void 逃跑();
}
}
公民A代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式
{
class 公民A:收听者
{
public 公民A(航空警报 airalert):base(airalert)
{
}
public override void 逃跑()
{
Console.WriteLine("我是公民A,快跑,航空警报响了");
}
}
}
公民B与公民A身份相同,所以代码实现基本一样,在此不再赘述。
主方法代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式
{
class Program
{
static void Main(string[] args)
{
侦察兵A observerA = new 侦察兵A();
公民A citizenA = new 公民A(observerA);
公民B citizenB = new 公民B(observerA);
observerA.增加(citizenA);
observerA.增加(citizenB);
observerA.报警();
侦察兵B observerB = new 侦察兵B();
observerB.增加(citizenA);
observerB.增加(citizenB);
observerB.报警();
}
}
}
运行效果图:
通过运行效果图可以看出,当侦察兵A报警后,监听航空警报的公民都会收到通知逃跑,侦察兵B报警效果一样。
在C#中好比事件和委托,用委托监视事件发生,一但事件发生,委托会把事件传递给监听者,监听者对此采取相应对策。
知识来源于生活,会生活的人才能学习好。巨人对生活进行了思考,并他们能把生活总结为一个个经典思想,而我们只是轻轻飘过,不带有一片云彩,这就是我们和巨人的差距。希望大家能留心生活的点点滴滴,它们将成为你学习知识的灵感之源。