《您的设计模式》(CBF4LIFE)之“观察者模式”【整理】
来源:互联网 发布:高仿爱奇艺影视源码 编辑:程序博客网 时间:2024/05/22 15:46
背景:《孙子兵法》有云:“知彼知己,百战不殆”。
知己是很容易的,自己的军队嘛,那怎么知彼呢?安插间谍是很好的一个方法,我们今天就来讲一个间谍的故事。
李斯成为最强诸侯秦国的上尉,致力于统一全国,于是安插了间谍到各个国家的重要人物的身边,以获取必要的信息,韩非子作为韩国的重量级人物,身边自然没少间谍。
JDK中提供了:java.util.Observable实现类和java.util.Observer接口,可用于观察者模式的实现。
1、1名 被观察者:
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("韩非子在娱乐");}}
2、3名观察者:
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这个类,其中有一个方法就是根据接口查找所有的实现类,问题解决了吧!我可以查找到所有的观察者,然后全部加进来,以后要是新增加观察者也没问题,程序都不用改。
- 《您的设计模式》(CBF4LIFE)之“观察者模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“策略模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“代理模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“门面模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“适配器模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“桥梁模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“命令模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“装饰模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“迭代器模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“组合模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“访问者模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“状态模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“单例模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“多例模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“工厂方法模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“抽象工厂模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“模板方法模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“建造者模式”【整理】
- SVN树冲突TreeConflict怎么解决
- 第九周项目三 稀疏矩阵的三元组表示的实现及应用(1)
- h264封装ts
- 基于抽象布局和炒鸡牛鼻adapter写的base下拉刷新功能,只需要一点点代码,就实现了不同数据的下拉刷新
- iOS崩溃日志收集
- 《您的设计模式》(CBF4LIFE)之“观察者模式”【整理】
- php封装分页类+分页实例
- java jsp 项目 javascript 文件合并压缩工具 AutoJS
- springMVC中web.xml中classpath的作用,及使用grandle构建项目
- ubuntu16.04 安装jdk、tomcat教程
- animation动画详解
- 最新App、手机网站尺寸规范—移动设备界面UI设计尺寸规范
- Xcode6.4注册URL Scheme步骤详解
- openlayers从入门到精通