首先声明, 本篇blog的内容是参考Design pattern FAQ Part 2 (Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步.
举个例子说明在什么情况下会使用观察者模式,比如说一个网站,有订阅的功能,读者在提交订阅申请的时候会写入自己的邮件地址。那么每当这个网站有新内容更新的时候,网站就会比遍历订阅列表,通知所有的订阅者该网站有更新了。 这就是相当于用户的邮箱都在监听该网站的变化,每个邮箱就相当于一个观察者。
在观察者模式中,存在两个概念,一个是主体(Subject),用来发送notification;另外一个是观察者(Observer),用来接收notification。下面的图片展示application(subject)如何发送notification给观察者(email,event and SMS)。这个例子同样也可以看成是发布者和订阅者这样的模型,发布者就是图片中的application,订阅者就是email, event log 和 sms。
那么我们来编码实现上面提到的这个例子,下面的这张图展示了订阅者(subscribers)类。不同的具体的subscriber类都继承同一个接口INotification,这个接口声明了notify方法。其他的具体的subscriber类都实现了这个接口,并且定义了自己的notify方法。在下面的这个例子中,我们仅仅调用了print函数用来表明特定的notification执行了。
正如前面所说在观察者模式中,存在两种类型的角色,上面的内容已经说明了Subscriber,下面我们将说明Publisher(Subject)。
Publisher类中维护了一个列表,该列表中保存了希望收到notification的subscriber对象。在Publisher中,使用’addNotification’和’removeNotification’方法能够添加或者删除订阅者(subscriber)。另外存在一个’NotifyAll’方法将遍历整个列表,并且发送notification。
上面已经有了Publisher和Subscriber,下面我们展示一下client如何使用。下面的图片Observer Client的代码片段。首先我们创建Notifier(Publisher)对象,这个对象维护了一个订阅者(Subscriber)集合。然后我们添加希望被通知(notify)的订阅者对象。当strCustomerCode的长度大于10的时候,通知所有的订阅者这件事情。
观察者模式存在两个优点,一个是降低了观察者和被观察者之间的耦合度,经验丰富的程序肯定会知道,降低模块之间的耦合度,就是提高系统灵活性的不二法宝;另外一个优点是能够建立一套触发机制,相当于说Publisher能够触发所有注册了notification的Subscriber。
分享编程、算法、机器学习、数据挖掘、推荐系统、大数据计算框架等知识,欢迎扫码关注。
原文地址:http://blog.csdn.net/geniusluzh/article/details/45876427