故事
小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。
在这样一个简单的故事场景中我们发现了什么?来看看小雪和男孩们的烦恼:
男孩们必须不断的询问小雪的位置变化,从而打断正常的工作
小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问,也影响正常的工作。
如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式,而且不断的有新的男孩们增加进来,还不知道未来有什么新的回复方式。
看到这么多烦恼,我们创意无限的Nokia公司给小雪和男孩们提出了解决方案:
Nokia公司荣誉出品了一款带有GPRS功能的手机,该手机保存着一个订阅位置变化短信通知的电话列表,当该手机检测到位置发生变化就会向这个订阅列表里的所有手机发送短信。看到Nokia这个解决方案,男孩们和小雪都应该松一口气,他们各自都可以按照自己正常的生活习惯,只有状态发生变化时候各自才会进行通信。
观察者模式的解决方案
在上面Nokia的解决方案中就透露出观察者模式的思想:观察者模式定义了对象之间一对多的依赖,当这个对象的状态发生改变的时候,多个对象会接受到通知,有机会做出反馈。在运行的时刻可以动态的添加和删除观察者。
带着这个定义我们来看看尝试实现上面的观察者模式
首先在观察者模式中我们必须定义一个所有“观察者”都必须实现的接口,这样被观察者向观察者发送消息的时候就可以使用统一的方式,这也符合面相对象原则中的面向接口编程:
//所有观察者都必须实现
public interface IBoy
{
//向男孩们显示小雪位置情况,也就是向观察者发送消息,观察者还可以对此做出反馈
void Show(string address);
}
using System;
//男孩A,一个观察者
public class BoyA : IBoy
{
public void Show(string address)
{
//假设经过处理后为韩文的地址
Console.WriteLine("A:"+address);
}
}
using System;
//男孩B,又一个观察者
public class BoyB : IBoy
{
public void Show(string address)
{
//假设经过处理后为英语的地址
Console.WriteLine("B:"+address);
}
}