本文的参考文章及书籍:
http://cmsblogs.com/?p=5065
《head first设计模式》
1.观察者模式概述
何为观察者模式,即当一个事物变化时,观察它的人都能接收到变化的消息。例如红灯停,绿灯行,我们监听者红灯的变化,在变化后做出对应的反应,又如报社和阅读者,阅读者订阅报社的报纸,当报纸出版新的新闻时候就会发布给订阅的阅读者,也称为发布/订阅。
2.观察者模式的实现
假设我们来到英雄联盟的场景,草丛三兄弟盖伦、德玛、皇子为一个阵营,当三兄弟中的其中一个受到伤害时,另外两兄弟会前去救援。这就引出了当受伤时候得通知其他两兄弟,兄弟们得互相观察对方是否受伤,这时候我们引入一个转发器。转发器用来通知兄弟受伤前去救援,三兄弟观察转发器是否发出通知。
3.具体类的设计
首先定义一个被观察者接口,只要是被观察者实行其该接口。该接口有三个主要的方法,注册观察者,移除观察者,发布通知。如下图所示:
接着定义一个观察者接口,接口中一个update方法用来表示当被观察者状态发生改变时下发通知调用此方法,使观察者发生改变,该观察者接口(Observer)定义如下图所示:
定义完两个接口后,根据业务进行具体的实现,首先三兄弟盖伦、德邦、皇子实现观察者接口,当有人受伤时前去救援,具体的实现如下图所示:
定义转发器实现被观察者接口,用一个list列表存放观察者,表示要通知的对象,如本例的三兄弟,registerObserver添加三兄弟,notifyObserver通知前去救援,removeObserver根据传参移除三兄弟中的一个。具体代码实现如下图所示:
用客户端进行模拟,创建出三兄弟实例以及转发器,将三兄弟添加入转发器当中进行观察,当有人受伤时,转发器发出消息进行通知,如下图所示:
JDK中也有对观察者模式的支持具体为java.util.Observer和java.util. Observable这两个类,可看其具体的源码实现方式。