《您的设计模式》(CBF4LIFE)之“观察者模式”【整理】

来源:互联网 发布:高仿爱奇艺影视源码 编辑:程序博客网 时间:2024/05/22 15:46

背景《孙子兵法》有云“知彼知己,百战不殆”。

 知己是很容易的,自己的军队嘛,那怎么知彼呢?安插间谍是很好一个方法,我们今天就来一个间谍的故事

李斯成为最强诸侯秦国的上尉,致力于统一全国,于是安插了间谍到各个国家的重要人物的身边,以获取必要的信息,韩非子作为韩国的重量级人物,身边自然没少间谍。

 

JDK中提供了java.util.Observable实现类java.util.Observer接口,可用于观察者模式的实现。

 

11 被观察者

package com.teng.pattern.impl;import java.util.Observable;/** * 韩非子,被观察者 * <br>创建日期:2016年7月30日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class HanFeiZi extends Observable {/** * 韩非子,吃饭 * @since 1.0 * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年7月30日 下午5:16:37 */public void haveBreakfast(){System.out.println("韩非子开始吃饭。。。。。。");super.setChanged();super.notifyObservers("韩非子在吃饭");}/** * 韩非子,娱乐 * @since 1.0 * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年7月30日 下午5:16:39 */public void haveFun(){System.out.println("韩非子开始娱乐。。。。。。");super.setChanged();super.notifyObservers("韩非子在娱乐");}}

23名观察者

package com.teng.pattern.impl;import java.util.Observable;import java.util.Observer;/** * 李斯,观察者 * <br>创建日期:2016年7月30日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class LiSi implements Observer {@Overridepublic void update(Observable arg0, Object obj) {System.out.println("李斯:开始汇报。。。");notifyQin(obj.toString());System.out.println("李斯:结束汇报。。。");}private void notifyQin(String context){System.out.println(context);}}
package com.teng.pattern.impl;import java.util.Observable;import java.util.Observer;/** * 刘斯,观察者 * <br>创建日期:2016年7月30日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class LiuSi implements Observer {@Overridepublic void update(Observable o, Object obj) {System.out.println("刘斯:开始汇报。。。");notify(obj.toString());System.out.println("刘斯:结束汇报。。。");}private void notify(String context){System.out.println(context);}}
package com.teng.pattern.impl;import java.util.Observable;import java.util.Observer;/** * 王斯,观察者 * <br>创建日期:2016年7月30日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class WangSi implements Observer {@Overridepublic void update(Observable o, Object obj) {System.out.println("王斯:开始汇报。。。");notifyWang(obj.toString());System.out.println("王斯:结束汇报。。。");}private void notifyWang(String context){System.out.println(context);}}

3、客户端,演示被观察者观察到:

package com.teng.pattern.impl;import java.util.Observer;/** * 客户端 * <br>创建日期:2016年7月30日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class Client {/** * 主方法 * @since 1.0 * @param args * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年7月30日 下午5:31:19 */public static void main(String[] args) {//定义观察者Observer liSi = new LiSi();Observer liuSi = new LiuSi();Observer wangSi = new WangSi();//定义被观察者HanFeiZi hanFeiZi = new HanFeiZi();//添加观察者hanFeiZi.addObserver(liSi);hanFeiZi.addObserver(liuSi);hanFeiZi.addObserver(wangSi);//被观察者,吃饭hanFeiZi.haveBreakfast();}}

打印

 

韩非子开始吃饭。。。。。。

王斯:开始汇报。。。

韩非子在吃饭

王斯:结束汇报。。。

刘斯:开始汇报。。。

韩非子在吃饭

刘斯:结束汇报。。。

李斯:开始汇报。。。

韩非子在吃饭

李斯:结束汇报。。。


以上就为观察者模式,观察者模式在实际项目的应用中非常常见,比如你到ATM机器上取钱,多次输错密码,卡就会被ATM吞掉,吞卡动作发生的时候,会触发哪些事件第一摄像头连续快拍,第二,通知监控系统,吞卡发生;第三,初始化ATM屏幕,返回最初状态,你不能因为就了一张卡,整个ATM不能用了吧,一般前两个动作都是通过观察者模式来完成的。

 

观察者在什么情况下使用呢?观察者可以实现消息的广播,一个消息可以触发多个事件,这是观察者模式非常重要的功能。使用观察者模式也有两个重点问题要解决

广播链的问题根据经验建议,在一个观察者模式中最多出现一个对象既是观察者也是被观察者,也就是说消息最多转发一次(传递两次)还是比较好控制的;

异步处理问题:如果观察者比较多,而且处理时间比较长怎么办?就用异步呗,异步处理就要考虑线程安全和队列的问题,这个大家有时间看看Message Queue,会有更深的了解。

 

以前讲到工厂方法模式的时候用到了ClassUtils这个类,其中有一个方法就是根据接口查找所有的实现类,问题解决了!我可以查找到所有的观察者,然后全部加进来,以后要是新增加观察者也没问题,程序都不用改。




0 0
原创粉丝点击