设计模式(二)观察者模式
引子
观察者模式,就是观察别人在干嘛,作为观察者,被观察者的一举一动都要了如指掌,作为被观察者,该干嘛干嘛,并不知道自己的一切行为都以为暴露在别人的监控之下。是不是有点谍战的意思。我们就用古代三国演义里诸葛亮和间谍来类比,演示一下什么是观察者模式。
来看看官方定义: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 + "!" + "王司徒:报告,丞相!诸葛村夫有动作了!!!");}
}
设计模式(二)观察者模式相关推荐
- 「设计模式(二) - 观察者模式」
「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...
- 开发之路(设计模式二:观察者模式)
继续我们的设计模式学习,有个好的"观察者"可以让你开发效率大大提高 直接进入正题,我们用一个气象站程序来模拟此模式. 有一个气象站程序,能对湿度,温度,气压进行监测并显示在&quo ...
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- 【白话设计模式二】外观模式(Facade)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 【白话设计模式二十二】解释器模式(Interpreter)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 游戏里的设计模式之观察者模式
游戏里的设计模式之观察者模式 观察者模式 观察这样一来,当一个对象改变状态时,它的所有依赖者都会收到通 知自动更新. ---------<head first 设计模式> 观察者模式的 ...
- 【23种设计模式】观察者模式(Observer Pattern)
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...
- 北风设计模式课程---观察者模式
北风设计模式课程---观察者模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.观察者模式注意点? 1.观察者模式的别名发布-订阅(Publish/S ...
- Android设计模式之观察者模式在项目中的实际使用总结
前言 观察者模式在Android开发中使用频率非常高,最常用的地方如订阅–发布系统,类似微信公众号用户订阅和接收消息的场景,因为这个模式最重要的功能就是解耦,将被观察者和观察者解耦,使得它们之间的依赖 ...
- java 观察者模式_图解Java设计模式之观察者模式
图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...
最新文章
- netcore读取json文件_.net core读取json格式的配置文件
- 如何对DB2数据库做性能分析?
- redis的info指令详解
- Https的握手协议
- 微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...
- android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位
- xargs命令和find的-exec
- SQL 存储过程传入多个ID
- 挣钱其实是一门学问也一个门道
- 关于如何在ASP.NET 2.0中定制Expression Builders
- java if 局部变量_java – 为什么局部变量在if-else构造中启动而在if-else-if构造中不启动?...
- 使用getopt_long解析程序长选项参数
- Redis进程异常退出排查
- 用了这些浏览器插件,让你的科研效率飞起
- 油猴(Tampermonkey)使用教程
- kd树的根节点_多维空间分割树--KD树
- Axure原型工具Axure RP9安装及Licensee
- 基于K210的人脸识别门禁
- 远程桌面连接计算机是什么,远程桌面连接是什么意思?
- vip.163邮箱登录指南,163vip邮箱体验分享