引子

观察者模式,就是观察别人在干嘛,作为观察者,被观察者的一举一动都要了如指掌,作为被观察者,该干嘛干嘛,并不知道自己的一切行为都以为暴露在别人的监控之下。是不是有点谍战的意思。我们就用古代三国演义里诸葛亮和间谍来类比,演示一下什么是观察者模式。

来看看官方定义:Observer Pattren(观察者模式)也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会地到通知并被自动更新。

先来看看总体类图

实例类图如下

被观察者接口

public interface IZhuGeLiang {void planB();void attack();
}
public interface Observable {//增加一个观察者void addObserver(Observer observer);//删除一个观察者void deleteObserver(Observer observer);//既然要观察,我发生了改变他也应该有所动作,通知观察者void notifyObservers(String context);
}

被观察者实现类

public class ZhuGeLiang implements Observable,IZhuGeLiang{//定义一个变长数组,存放所有观察者private ArrayList<Observer> observers = new ArrayList<>();@Overridepublic void addObserver(Observer observer) {this.observers.add(observer);}@Overridepublic void deleteObserver(Observer observer) {this.observers.remove(observer);}@Overridepublic void notifyObservers(String context) {for (Observer ob : observers) {ob.update(context);}}//诸葛亮要谋划计策了public void planB() {System.out.println("诸葛亮:开始谋划计策了...");//通知所有观察者this.notifyObservers("诸葛亮在密谋");}//诸葛亮要准备起兵了public void attack() {System.out.println("诸葛亮:准备战斗了...");this.notifyObservers("诸葛亮要起兵");}
}

观察者接口

public interface Observer {//一旦发现别人有动静,就立马行动起来void update(String context);
}

具体的观察者

public class WangSiTu implements Observer {//王司徒视诸葛亮为不共戴天之敌@Overridepublic void update(String context) {System.out.println("王司徒:观察到诸葛亮有动作,要准备报告曹丞相...");this.reportToCaoCao(context);System.out.println("王司徒:汇报完毕...\n");}//汇报给曹操public void reportToCaoCao(String reportContext) {System.out.println(reportContext + "!" + "王司徒:报告,丞相!诸葛村夫有动作了!!!");}
}
public class LiuBei implements Observer {//刘备@Overridepublic void update(String context) {System.out.println("刘备:观察到诸葛亮有动作,干得漂亮...");this.happy(context);System.out.println("刘备:老诸很牛逼啊...\n");}//汇报给曹操public void happy(String reportContext) {System.out.println(reportContext + "!" + "刘备:回来重赏诸葛村夫!");}
}
public class SunQuan implements Observer {//孙权老哥@Overridepublic void update(String context) {System.out.println("孙权:观察到诸葛亮有动作,干我毛事...");this.kanReNao(context);System.out.println("孙权:看看热闹...\n");}//汇报给曹操public void kanReNao(String reportContext) {System.out.println(reportContext + "!" + "孙权:我就安安静静的当个吃瓜群众...");}
}

场景类

public class Clinet {public static void main(String[] args) {//生产出三个观察者Observer wst = new WangSiTu();Observer lb = new LiuBei();Observer sq = new SunQuan();//定义出诸葛亮ZhuGeLiang zgl = new ZhuGeLiang();zgl.addObserver(wst);zgl.addObserver(lb);zgl.addObserver(sq);zgl.planB();//zgl.attack();}
}

运行结果

观察者模式的优点

  • 观察者和被观察者之间是抽象耦合。
  • 建立一套触发机制。

观察者模式的缺点

观察者模式需要考虑一下开发效率和运行效率问题,一个观察者,多个被观察者,开发和调试就会比较复杂,而且在JAVA中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。多级触发时的效率更是让人担忧,在设计时注意考虑。

观察者模式使用场景

  • 关联行为场景。
  • 事件多级触发场景。
  • 跨系统的消息交换场景,如消息队列的处理机制。

JAVA中的观察者模式

JDK中提供了:java.util.Observable实现类和java.util.Observer接口,上述例子我们可以改造一下。

优化后的被观察者

public class ZhuGeLiang implements Observable,IZhuGeLiang{//此时的Observable是java.util.Observable下的//诸葛亮要谋划计策了public void planB() {System.out.println("诸葛亮:开始谋划计策了...");//通知所有观察者super.setChanged();super.notifyObservers("诸葛亮在密谋");}//诸葛亮要准备起兵了public void attack() {System.out.println("诸葛亮:准备战斗了...");super.setChanged();super.notifyObservers("诸葛亮要起兵");}
}

优化后的观察者

public class WangSiTu implements Observer {//这里的Observer是java.util.Observer下的//王司徒视诸葛亮为不共戴天之敌@Overridepublic void update(Observable observable, Object obj) {System.out.println("王司徒:观察到诸葛亮有动作,要准备报告曹丞相...");this.reportToCaoCao(obj.toString());System.out.println("王司徒:汇报完毕...\n");}//汇报给曹操public void reportToCaoCao(String reportContext) {System.out.println(reportContext + "!" + "王司徒:报告,丞相!诸葛村夫有动作了!!!");}
}

设计模式(二)观察者模式相关推荐

  1. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

  2. 开发之路(设计模式二:观察者模式)

    继续我们的设计模式学习,有个好的"观察者"可以让你开发效率大大提高 直接进入正题,我们用一个气象站程序来模拟此模式. 有一个气象站程序,能对湿度,温度,气压进行监测并显示在&quo ...

  3. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  4. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  5. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  6. 游戏里的设计模式之观察者模式

    游戏里的设计模式之观察者模式 观察者模式 观察这样一来,当一个对象改变状态时,它的所有依赖者都会收到通 知自动更新. ---------<head first 设计模式> ​ 观察者模式的 ...

  7. 【23种设计模式】观察者模式(Observer Pattern)

    个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...

  8. 北风设计模式课程---观察者模式

    北风设计模式课程---观察者模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.观察者模式注意点? 1.观察者模式的别名发布-订阅(Publish/S ...

  9. Android设计模式之观察者模式在项目中的实际使用总结

    前言 观察者模式在Android开发中使用频率非常高,最常用的地方如订阅–发布系统,类似微信公众号用户订阅和接收消息的场景,因为这个模式最重要的功能就是解耦,将被观察者和观察者解耦,使得它们之间的依赖 ...

  10. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

最新文章

  1. netcore读取json文件_.net core读取json格式的配置文件
  2. 如何对DB2数据库做性能分析?
  3. redis的info指令详解
  4. Https的握手协议
  5. 微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...
  6. android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位
  7. xargs命令和find的-exec
  8. SQL 存储过程传入多个ID
  9. 挣钱其实是一门学问也一个门道
  10. 关于如何在ASP.NET 2.0中定制Expression Builders
  11. java if 局部变量_java – 为什么局部变量在if-else构造中启动而在if-else-if构造中不启动?...
  12. 使用getopt_long解析程序长选项参数
  13. Redis进程异常退出排查
  14. 用了这些浏览器插件,让你的科研效率飞起
  15. 油猴(Tampermonkey)使用教程
  16. kd树的根节点_多维空间分割树--KD树
  17. Axure原型工具Axure RP9安装及Licensee
  18. 基于K210的人脸识别门禁
  19. 远程桌面连接计算机是什么,远程桌面连接是什么意思?
  20. vip.163邮箱登录指南,163vip邮箱体验分享

热门文章

  1. “问渠哪得清如许?为有源头活水来” – 提高技术源头数据的质量成为技术信息化热点
  2. 详解ORACLE数据库的分区表
  3. 关于前端上传文件到七牛云的一些笔记
  4. AD620仪表放大器介绍
  5. 艺龙私有化,携程与腾讯眉来眼去
  6. strong_alias、weak_alias
  7. 如何使用电脑来程控数字示波器(一)USB接线程控
  8. 隐藏在QRCode二维码背后的秘密
  9. 关于FPS透视原理的研究(一)
  10. java多线程,卖票案例