设计模式 --- 观察者模式(The observer pattern)
最近学习了下设计模式,这也算是自己的一个学习笔记吧。
闲话不说,先来看第一个模式 --- 观察者模式(我是按照Head First Design Patterns这本书里面的顺序学习的)。
1. 什么是观察者模式
借用原文的一句话可以概括:发布者 + 订阅者 = 观察者模式(publishers + subscribers = observer pattern)
其实, 讲的直白点。比如在我们天朝,共产党和国民党在打仗,那如果共产党想知道国民党的一举一动怎么办?很简单,派个地下党过去。然后地下党切取到情报后,用无线电广播电台发回他的联络者。这样共产党就可以随时知道国民党的一举一动了。
那这里,这个间谍就是我们的发布者,而他的联络者就是订阅者了。他们一起密切配合就完成了我们的观察者模式。
2. 观察者模式的用途
根据上面说的原理,那它的作用就显而易见了,同样借用原文里面的一句话:让你随时了解你的对象(Keeping your objects in the know)。
同样举个例子:
比如你有两个模块,根据低耦合的设计规则,显然,我们希望两个模块的联系越少越好。但如果这两个模块还要互相通信,那怎么办?
用观察者模式就很easy啦, A模块在B模块安置一个地下党,然后地下党拿到B模块的情报后随便发回A模块好了(不过这里B模块不但不会打击这个地下党,还会为他提供进入自己模块的接口,哈哈)。
3. 观察者模式的用法
ok ... 既然知道了观察者模式是什么,也明白了有什么用。那有些童鞋也许会问,到底怎么使用呀?
那这个可以分两个方面说明,举个例子,比如我有个系统,需要从物理设备上采集数据,然后在界面上显示给用户。我们暂且把这个系统简单的抽象成两个模块(实际中肯定不止) A模块 --- 展示数据 , B模块 --- 从物理设备上采集数据。那A怎么知道B上面的数据有更新呢?
好了。。。 如下:
(1). B模块对外公布一个监听器接口, 用java 可以用如下类似的形式:
///提供一个别人进入自己模块的接口
public void registerListener(Listener listener){
listenerArrayList.add(listener);
}
(2). 那么A模块启动后,可以这样写:
Listener mAListener = new Listener(){
////要实现的回调方法在这里实现, 换句话说,这里处理地下党发回来的消息。你想怎么处理都可以.
public void callBack(Message msg){
display(msg);
};
};
///向B模块的地下党添加一个需要的联络者
B.registerListener(mAListener);
(3). 当B有了数据更新后,B可以这样做:
private void dispatchMessage(Message msg){
///这里相当于地下党拿到情报后,挨个发给他的联络者
foreach (Listener listener: listenerArrayList){
listener.callBack(msg);
}
}
这样就基本上完成了整个观察者模式, B模块有了消息更新后,A模块就马上知道了。从而把更新的数据显示给用户。
4. 最后用原文的一句话总结下:
观察者模式 --- 当你感兴趣的事情发生时,不要错过(Don't miss out when something interesting happens)!