2_The_Observer_Pattern。

Head First Design Patterns 读书笔记

概念

观察者模式主要的功能是用来解决一类一对多的关系。
类似于报纸出版商和订阅者关系。
报纸出版(数据更新)会将通知订阅者。订阅者有权取消订阅。当取消订阅就不再接受通知。
Publishers + Subscribers = Observer Pattern

我们叫publisher为SUBJECT, 叫subscribers 为OBSERVERS
当subject更新之后,所有的observers都会被通知。

Subject和observers被定义为一对多的关系。observer是独立于subject的。当subject更新的时候,observer会得到通知。

实现结构:

主要是要定义两个接口:
interface:

  • Subject

    • registerObserver()
    • removeObserver()
    • notifyObserver()
  • Observer

    • Update()

对于Subject,需要实现Subject接口。对于所有的观察值,实现Observer的接口。
Implantation:

  • ConcreteSubject
    //实现subject接口的方法

  • ConcreteObserver
    //实现observer接口的方法

观察者模式的subject和observers是松散耦合。因为
1.subject所知道的关于observer的信息只有一个确定的接口。他并不需要知道其他的信息。
2.我们可以在任何时候都加入新的observer,我们也可以在任何时候删除。
3. 再加入新的类型observer时我们从来都不需要修改subject
4. 我们可以独立的重用subject或observer
5. 在修改subject或者observer不会影响其他的。

准则三

设计准则:Strive for loosely coupled designs between objects that interact.
尽量让相互影响的对象之间的松耦合

应用实例:

例:有一个天气数据,需要实时的显示在三个终端上。当天气的数据发生改变时,终端的显示要进行响应的改变。

/**
*Interface
*///Subject.java
public interface Subject {//用来注册Observerpublic void registerObserver(Observer o);//用来删除注册public void removeObserver(Observer o);//用来通知Observerspublic void notifyObservers();
}//Observer.java
/*** 观察者接口。jdk1.0就有此接口,只是参数些许不同。* @author Spade*2019年12月3日*/
public interface Observer {/*** Observer的接口* @param temp* @param humidity* @param pressure*/public void update(float temp, float humidity, float pressure);
}//WeatherData.java
/*** 因为这个weatherData是subject,所以需要继承Subject的接口。* @author Spade*2019年12月3日*/
public class WeatherData implements Subject{private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}/*** 注册,将observer放在观察者列表中*/@Overridepublic void registerObserver(Observer o) {observers.add(o);}/*** 从观察者列表中删除某个observer*/@Overridepublic void removeObserver(Observer o) {int index = observers.indexOf(o);if(index >= 0) {observers.remove(index);}}/*** 如果更新就通知所有的observer*/@Overridepublic void notifyObservers() {for (Observer ob : observers) {ob.update(temperature, humidity, pressure);}}/*** 用来通知*/public void dataChanged() {notifyObservers();}//其他方法,例如data的更新
}//Display.java
public class Display implements Observer{private float temperture;private float humidity;public Display(Subject weatherData) {//注意://在这里接受weatherData并且注册自己weatherData.registerObserver(this);}/*** update的实现*/@Overridepublic void update(float temp, float humidity, float pressure) {this.temperture = temp;this.humidity = humidity;//other functionsshow();}public void show() {System.out.println("temperture:"+temperture + "humidity"+ humidity);}
}//test.java
//测试public static void main(String[] args) {//创建一个subjectWeatherData weatherData = new WeatherData();//创建若干个observerDisplay display1 = new Display(weatherData);Display display2 = new Display(weatherData);Display display3 = new Display(weatherData);weatherData.setData(80,45,23.2f);}

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

  1. Observer Pattern 观察者模式

    Observer Pattern (观察者模式) 定义: <设计模式>中对Observer模式的意图是这样描述的:"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, ...

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

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

  3. 设计模式记--Observer Pattern观察者模式

    观察者模式--定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新.   从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需 ...

  4. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

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

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

  6. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    C#设计模式之十六观察者模式(Observer Pattern)[行为型] 原文:C#设计模式之十六观察者模式(Observer Pattern)[行为型] 一.引言 今天是2017年11月份的最后一 ...

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

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

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

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

  9. 设计模式のObserver Pattern(观察者模式)----行为模式

    一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...

最新文章

  1. 全了!从Python入门到精通
  2. 利用SMTP收发邮件
  3. Py之any函数【转载】
  4. python turtle循环图案-有趣的Python turtle绘图
  5. 图集内子图压缩及 ETC2 fallback选项的作用
  6. Windows 安装redis
  7. linux 6.8 安装教程,CentOS 6.8 7.2 安装图解详细教程
  8. Linux远程批量工具mooon_ssh和mooon_upload使用示例
  9. python标准库之参数解析库
  10. java 批量替换字符串_# Java 一步一步实现高逼格的字符串替换工具(二)
  11. java exception 包_什么是Java中的异常包装?
  12. Eclipse开发struts完全指南(二)安装与配置
  13. dio设置自定义post请求_Flutter用dio封装http网络请求,设置统一的请求地址、headers及处理返回内容...
  14. 每天一个PS技巧(原理+实践)——简单背景的抠图与毛发抠图
  15. oblog46_Final_20080623 软件下载
  16. 关于第一型曲面积分的再思考
  17. 打印机墨水添加方法(二)
  18. 雅居乐陈卓林第二人生业主文化节收官,记录下这些天的温情与感动
  19. WPF 如何在静态资源定义字体大小
  20. C语言编程题:用泰勒级数求自然数e的近似值

热门文章

  1. 云计算行业发展到底有多火?人才需求大吗?就业“钱”景好吗?
  2. 超详细VSCode安装教程(Windows)
  3. 香港十大正规外汇黄金交易平台排名(2021版)
  4. c语言中extem的作用,extern是什么意思?C语言中extern用法全解
  5. 英媒说中美网络战“握手言和” 中方攻击显著减少
  6. 【latex】3 会议期刊论文模板的使用方法(包括矢量图片处理方法)
  7. [C++题目] 根据快递商品的重量计算应付运费用
  8. 未来50亿年科学预测
  9. ElasticSearch 是什么?
  10. Python爬取《哆啦A梦-伴我同行2》影评,手把手带你绘制词云图!