2019年3月25日11:01:22

写在前面的话

正值金三银四跳槽季,设计模式也是常问的问题之一。本人在3月2日的一次面试的二面中,问到设计模式,问到了观察者模式,而且要求写了伪代码。当时我脑子里就第一个想到的就是《大话设计模式》里面的一个例子,就是员工集体开小差,前台妹妹负责在老板回来时通知所有人。当时回答得结结巴巴,写得代码勉勉强强,惊喜的是二面过了。归,温习之。

定义

世界上有这么一天,当你来到他们的世界,他们成为你终生的订阅者,随你快乐而快乐,随你忧愁而忧愁。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。————《设计模式:可复用面向对象软件的基础》

观察者模式是一种对象行为型模式。

使用场景

当一个对象的改变(名词)需要改变(动词)其他对象的时候。

观察者模式可以解决什么问题:

  • 1、应该定义对象间一对多的依赖关系,而不使对象紧密耦合。(达到依赖关系,又不紧耦合)
  • 2、应该确保一个对象改变时,无限制的依赖对象自动更新。
  • 3、应该一个对象可以通知无限制的其他对象。

第2种情况,消息中间件就是实现之一,当一个生产者发送消息过来,无限制的消费者拿到消息自动更新自己。

第3中情况,发布-订阅推模式,微信公众号应该就是其中有代表性的,当有内容更新,主动通知订阅者。

角色

抽象主题(Subject): 定义了被观察者常用的方法,订阅(attach)、取消订阅(detach)和通知(notify)功能

具体主题(ConcreteSubject):实现抽象主题定义的方法,通过attach和detach方法维护一个观察者的集合,当自己维护的状态(state)改变时通知(notify)所有观察者

抽象观察者(Observer):定义更新自己的方法

具体观察者(ConcreteObserver):实现更新自己的的方法

图示

观察者类图:

观察者序列图:

代码示例

代码示例就使用上面说过的那个例子,员工集体开小差,前台小妹负责在老板回来的时候通知所有人。

首先,前台妹妹是具体主题角色,员工是具体观察者角色。其次,前台妹妹维护着观察者集合,在老板回来了这个状态上通知所有观察者;观察者在前台妹妹通知之后执行自己的更新方法,该干嘛干嘛。

抽象主题:

public interface Observable {public void attach(Observer observer);public void detach(Observer observer);public void notifyObservers();
}

前台妹妹(具体主题即被观察者):

public class Receptionist implements Observable {private String state = "老板出去了";private ArrayList<Observer> observers = new ArrayList<>();public String getState() {return state;}public void setState(String state) {this.state = state;System.out.println(state);}@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {observers.forEach(observer -> observer.update());}
}

看NBA员工观察者:

public class NBAObserver implements  Observer{@Overridepublic void update() {System.out.println("正在看NBA直播的关掉NBA直播,工作");}
}

炒股员工观察者:

public class StockObserver implements Observer {@Overridepublic void update() {System.out.println("正在炒股的关闭股市面板,工作");}
}

观察者模式测试类:

public class ObserverTest {public static void main(String[] args) {Receptionist mm = new Receptionist();Observer nba = new NBAObserver();Observer stock = new StockObserver();mm.attach(nba);mm.attach(stock);// mm看到老板回来了mm.setState("老板回来了");// 通知已经订阅的员工mm.notifyObservers();}
}

测试结果:

笔记:明明是前台妹妹在观察老板是否回来了,为什么前台妹妹是被观察者呢?

“老板回来了”这个状态是前台妹妹的内部状态,观察者模式是对象之间的关系,看NBA的和炒股的观察者监听前台妹妹的状态,发生变化时更新自己。

Java类库中的观察者模式

在java类库中有java.util.Observer和java.util.Observable作为观察者和被观察者,因为作用有限,在Java 9中已经弃用(deprecated)。

优点

  • 满足了当一个对象的改变需要改变其他对象这个条件的前提下,实现了松耦合。
  • 符合开闭原则,继承抽象主题添加被观察者,继承抽象观察者添加观察者。

缺点

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

总结

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

参考

《大话设计模式》

2019年3月26日15:02:09


由于本人水平有限,如果本文有什么错漏,请不吝赐教
感谢阅读,如果您觉得本文对你有帮助的话,可以点个赞同

java 观察者模式_观察者模式(Observer Pattern)相关推荐

  1. python实现观察者模式_观察者模式--python

    参见:http://baike.baidu.com/view/1854779.htm http://blog.csdn.net/huangkangying/article/details/790160 ...

  2. angualr8观察者模式_观察者模式

    用 C# 实现了示例并优化了一下: Subject.cs public class Subject { private readonly List _observers = new List(); p ...

  3. 设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现

    文章目录 概念 Code [主题] [观察者s] 观察者一 观察者二 [测试] 源码分析 java.util.Observable 目标类 java.util.Observer 观察者接口 notif ...

  4. Java Observer Pattern(观察者模式)

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 关键代码:在抽象类里有一个 ArrayL ...

  5. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  6. 艾伟_转载:.NET设计模式:观察者模式(Observer Pattern)

    概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将 ...

  7. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  8. HeadFirst 设计模式(二)观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 在对象之间建立一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新. 设计原则 找出应用中可能需要变化之处,把它们独立出来, ...

  9. 设计模式(二)The Observer Pattern(观察者模式)

    2_The_Observer_Pattern. Head First Design Patterns 读书笔记 概念 观察者模式主要的功能是用来解决一类一对多的关系. 类似于报纸出版商和订阅者关系. ...

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

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

最新文章

  1. AI手机报告 | 揭秘手机行业未来AI之路
  2. QEMU — I/O 设备操作
  3. 含代码 | 支付宝如何优化移动端深度学习引擎?
  4. Qt-线程启动与关闭实例
  5. 纪年法:公元和公元前
  6. 实习学习:项目用的DDD,什么是DDD开发?
  7. OPERA团队一 开功能配参数
  8. linux老自动重启原因,【重启】查询linux自动重新启动原因
  9. 你知道啥是无监督聚类吗?
  10. php获取中文字符拼音首字母 阿星小栈
  11. 大数据之clickhouse_clickhouse的基础介绍及基础使用
  12. 出书最多--map值排序
  13. C++中的随机数函数(
  14. SQL server 2005简体中文版下载
  15. 解决Windows 7下IE11无法卸载、无法重新安装,提示安装了更新的IE版本
  16. 普通话测试哪个软件准确吗,免费普通话测试软件哪个好_哪个app可以免费测普通话_普通话测试软件准不准...
  17. Go C 编程 第4课 变色魔法(魔法学院的奇幻之旅 Go C编程绘图)
  18. win10 条件下在anaconda中安装face_recognition(超简单,亲测有效)
  19. 艺术留学|服装设计专业2019院校排名
  20. 专业的python培训机构吃透Python的金融实务应用

热门文章

  1. Ubantu 安装ftp 之诡异
  2. Syslog日志中心服务器收集windows和linux客户端日志
  3. Jtable 表格按多列排序(支持中文汉字排序)
  4. javascript设计模式——Module
  5. [转载] 财经郎眼20120526:山东首富挑战国家电网
  6. ms sqlserver对象、所属用户、所属架构、登陆用户、同义词
  7. Mybatis-plus 多表联查实现(非手写sql)
  8. html5 星际摩托,HTML5 星际陨石环绕动效
  9. JVM监控及诊断工具GUI篇之Arthas(一):基础指令
  10. Mybatis工作中常用动态SQL总结