现在的位置: 首页 > 综合 > 正文

设计模式 — 观察者模式(The observer pattern)

2012年11月13日 ⁄ 综合 ⁄ 共 1458字 ⁄ 字号 评论关闭

设计模式 ---  观察者模式(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)!

 

抱歉!评论已关闭.