当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。主要解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作

大话设计模式中程杰老师对观察者模式的定义是,观察者模式:定义对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己

观察者模式结构图如下:

示例代码:

package com.dfcDemo.observer;import java.util.ArrayList;
import java.util.List;/*** 抽象主题类或者抽象观察者类,一般用一个抽象类或者一个接口实现,* 它把所有对对象的引用保存在一个集合中,每个主题都可以有任意数* 量的观察者* @author lmb**/
public abstract class Subject {private List<Observer> observers = new ArrayList<Observer>();//add observerpublic void attach(Observer observer){observers.add(observer);}//remove observerpublic void detach(Observer observer){observers.remove(observer);}//send notify to observerspublic void sendNotify(){for(Observer o : observers){o.update();}}}
package com.dfcDemo.observer;/*** 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己* @author lmb**/
public abstract class Observer {public abstract void update();}
package com.dfcDemo.observer;
/***  具体通知者,将有关状态存入具体观察者对象;*  在具体主题的内部状态改变时,给所有登记过的观察者发出通知。*  具体主题角色通常用一个具体子类实现* @author lmb**/
public class ConcreteSubject extends Subject{private String subjectState;public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;}}
package com.dfcDemo.observer;
/*** 具体观察者:实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调* @author lmb**/
public class ConcreteObserver extends Observer{private String observerState;private ConcreteSubject subject;public String name;//constructorpublic ConcreteObserver(ConcreteSubject subject, String name){this.subject = subject;this.name = name;}public ConcreteSubject subject(){return subject;}@Overridepublic void update() {observerState = subject.getSubjectState();System.out.println("The observer's state of " + name + " is " + observerState);     }}
package com.dfcDemo.observer;public class TestObserver {public static void main(String[] args) {//build the object of subjectConcreteSubject subject = new ConcreteSubject();//add observer for the object of subjectsubject.attach(new ConcreteObserver(subject,"observer Tom"));subject.attach(new ConcreteObserver(subject,"observer Jerry"));subject.attach(new ConcreteObserver(subject,"observer Jack"));//set the state of subjectsubject.setSubjectState("ready");subject.sendNotify();}}

运行结果:

The observer's state of observer Tom is ready
The observer's state of observer Jerry is ready
The observer's state of observer Jack is ready

观察者模式的特点:

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。

使用场景:

1、当一个对象的改变需要同时改变其他对象,并且它不知道具体有多少对象有待改变时,应考虑使用观察者模式;

2、一个抽象模型有两个方面,其中一方面依赖与另一方面,这是观察者模式可以将这两者封装在独立的对象中是它们各自独立地改变和复用。

总的来讲,观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化

优点

观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。

缺点

依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。

改进

使用事件和委托来改进

大话设计模式—观察者模式相关推荐

  1. 【大话设计模式】设计模式系统学习大合集

    转载请注明出处:http://blog.csdn.net/column/details/designpatternbylmb.html 为了方便各位网友学习以及方便自己复习之用,将设计模式的系列内容按 ...

  2. 大话设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

  3. java 之 观察者模式(大话设计模式)

    观察者模式,笔者以前做校验订单时用过一次,只是不知道有这个模式,当时使用观察者省略了N多if else 在笔者看来观察者模式比较试用于一个对象状态改变后,很多个对象也要根据这个状态做相应的动作,当然观 ...

  4. [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式

    源码可以在这里找到 大话设计模式C++版 双向耦合的代码 //Secretary.h 秘书类 #include <QList>using namespace std; class Stoc ...

  5. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  6. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  7. JAVA 设计模式 观察者模式

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

  8. 《大话设计模式》读书笔记-索引

    <大话设计模式>读书笔记-第1章 简单工厂模式 <大话设计模式>读书笔记-第2章 策略模式 <大话设计模式>读书笔记-第3章 单一职责原则 <大话设计模式&g ...

  9. C++设计模式-观察者模式

    目录 基本概念 代码与实例 基本概念 观察者模式又叫做发布-订阅模式: 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象 ...

最新文章

  1. 1、使用库函数计算两个向量的夹角
  2. svn教程----TortoiseSVN常用操作
  3. cisco tftp 操作
  4. 改来改去把微服务改成了分布式单体
  5. 将二进制文件bold转化为文件file
  6. 0.00...1是个什么数?
  7. Python中字典(dict)详解
  8. 批处理 备份网络数据
  9. python用来自动修改pdf_python实现从pdf文件中提取文本,并自动翻译的方法
  10. 当你的服务器被黑了,一定要看是不是犯了这 5 点错误
  11. Atitit 调用百度语音识别 目录 1. 建立一个音频app项目,获得appid kersec 1 2. 直接使用JAR包步骤如下: 1 2.1. public class baiduAudio
  12. KITTI数据集解析和可视化
  13. ubuntu16.04便捷使用(常用工具、常用快捷键、常用使用教程)
  14. 中国西北地区专题地图合集(高清)
  15. 海康威视-海康门禁设备对接SDK-已完成完整封装调用
  16. STN:空间变换网络(Spatial Transformer Network)
  17. UBUNTU——启动栏图标问号?异常
  18. 网站制作的流程包括哪几个步骤?
  19. 阅读小结:The Unreasonable Effectiveness of Noisy Data for Fine-Grained Recognition
  20. C# Socket网络编程精华篇 (转)

热门文章

  1. oracle查找外键表
  2. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】
  3. android setGravity()的使用
  4. android 读取assets文件夹下的文件资源
  5. OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
  6. 前端-----数据类型和运算符
  7. 更换checkbox的原有样式
  8. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改
  9. Linux 配置文件
  10. C# 调用Word(PrintOut) 直接打印,出现“第一节的页边距设于可打印区域之外,是否继续”...