一、模式介绍

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

二、模式结构

三、模式代码

1、抽象观察者

package com.example.demo.observer;
//抽象观察者
public abstract class Observer {public abstract void update(String msg);
}

2、 主题(被观察者)

package com.example.demo.observer;import java.util.ArrayList;
import java.util.List;//主题
public class Subject {private List<Observer> observers = new ArrayList<>();    //状态改变public void setMsg(String msg) {notifyAll(msg);}//订阅(注册)public void addAttach(Observer observer) {observers.add(observer);}//通知所有订阅(注册)的观察者private void notifyAll(String msg) {for (Observer observer : observers) {observer.update(msg);}}
}

3、观察者A

package com.example.demo.observer;//A观察者
public class A_Student extends Observer {public void update(String msg) {System.out.println("A同学:"+msg+"  "+"快看书!");}
}

4、观察者B

package com.example.demo.observer;//B观察者
public class B_Student extends Observer {public void update(String msg) {System.out.println("B同学:"+msg+"  "+"手机收起来!");}
}

5、观察者C

package com.example.demo.observer;//C观察者
public class C_Student extends Observer {public void update(String msg) {System.out.println("C同学:"+msg+"  "+"哎呀,书拿反了!");}
}

6、模拟主题改变观察者状态

package com.example.demo.observer;public class Main {public static void main(String[] args) {Subject subject = new Subject();subject.addAttach(new A_Student());subject.addAttach(new B_Student());subject.addAttach(new C_Student());subject.setMsg("老师来了!");}
}

7、结果

四、使用情景

1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 
    2、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
    3、事件多级触发场景。
    4、跨系统的消息交换场景,如消息队列、事件总线的处理机制。

五、优缺点

优点:

解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。

缺点:

在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。

六、demo地址

https://github.com/tongyuxin1/designModel/tree/master/src/main/java/com/example/demo

一起学设计模式-观察者模式相关推荐

  1. 一起学设计模式 - 观察者模式

    观察者模式(ObserverPattern)属于 对象行为型模式的一种,定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新. 概述 观察者模式是一种 ...

  2. 小菜学设计模式——观察者模式

    2019独角兽企业重金招聘Python工程师标准>>> 背景 上一次去看电影院看电影,半旁边的妹子说只要扫一扫就能免费领取爆米花一份,你说我怎么躲得过妹子的招数呢?所以拿起我的手机, ...

  3. 讲故事,学(AHK)设计模式—观察者模式

    讲故事,学(AHK)设计模式-观察者模式 对象间的联动--观察者模式 观察者模式概述 观察者模式定义 讲故事,学设计模式 AutoHotkey代码 C++代码 JAVA代码 观察者模式总结 主要优点 ...

  4. 一起学设计模式 - 一起开始设计模式的修炼之路

    文章目录 一起学设计模式 - 一起开始设计模式的修炼之路 1.为什么要学设计模式 2.设计模式的六大原则 2.1 单一职责原则(Single responsibility principle) 2.2 ...

  5. 重学设计模式--读后总结篇,我理解的设计模式!!(二)

    极力推荐小傅哥的重学设计模式!!! 一.二十三种设计模式 1.二十三种设计模式 1.1 工厂方法模式 1.2 抽象工厂模式 1.3 建造者模式 1.4 原型模式 1.5 单例模式 1.6 适配器模式 ...

  6. Carson带你学设计模式:模板方法模式(Template Method)

    前言 今天Carson来全面总结最常用的设计模式 - 模板方法模式. Carson带你学设计模式系列文章 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南 Carson带你 ...

  7. 从零开始单排学设计模式「UML类图」定级赛

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  8. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  9. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

最新文章

  1. IBastis配置实例
  2. JavaSE各阶段练习题----多线程
  3. java final的内存_Java并发编程之final域的内存语义
  4. 前端学习(1874)vue之电商管理系统电商系统之修改element-ui组件的按需导入
  5. mysql获取各种日期
  6. python 简单web音频_Python Twisted web服务器音频fi
  7. 惠普HP1280墨盒型号
  8. 如果项目上线在上线期间出现BUG改怎么办?
  9. vue-router总结2
  10. deeplearning.ai——通过单隐藏层的神经网络实现平面数据分类
  11. FFmpeg音视频同步的问题
  12. java copyfile失败_如何修复CopyFile()错误5 - 访问被拒绝错误
  13. java的基本数据类型转换。
  14. Postman下载与安装操作步骤【超详细】
  15. SSM项目实战——图书管理系统
  16. 20210211 plecs diode rectifier 二极管整流电路 zero crossing 报错
  17. Linux CPU超频设置
  18. ubuntu 16.04 桌面版 双击自动删除文字 解决方案
  19. Qt编写安防视频监控系统10-视频轮询
  20. Kafka Streams开发单词计数应用

热门文章

  1. 脑电信号特征提取常用算法(共空间模式CSP、小波变换DWT、功率谱密度PSD、AR模型)
  2. Matlab 日常技巧 ,判断文件存在
  3. Python学习笔记:Day 7 编写MVC
  4. Python:Selenium错误小结
  5. centos 设置双网卡,双网关
  6. Python脚本如何生成Windows可执行文件.exe
  7. Windows中使用Python和C/C++联合开发应用程序起步
  8. 深入理解Linux软件包的配置、编译与安装
  9. php laravel 排序,php – 在laravel中排序数组
  10. 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale