当一个对象更改状态,可以自动通知并更新其所有依赖项(观察者),就像是事件总线,谁有监听,有消息时谁就会收到此消息

使用场景

当一个对象的状态改变,希望其它不知道是谁的对象也能够及时更新并且保证低耦合

代码示例


import java.util.ArrayList;
import java.util.List;/*** 可以通过此接口注册来监听天气情况*/
public class Weather {private String currentWeather;/*** 所有的观察者集合*/private List<WeatherObserver> observers;public Weather() {observers = new ArrayList<>();}/*** 添加观察者** @param obs 观察者*/public void addObserver(WeatherObserver obs) {observers.add(obs);}/*** 移除观察者** @param obs 需要移除的观察者*/public void removeObserver(WeatherObserver obs) {observers.remove(obs);}/*** 设置天气** @param weather*/public void setCurrentWeather(String weather) {currentWeather = weather;// 通知观察者notifyObservers();}/*** 通知所有观察者**/private void notifyObservers() {for (WeatherObserver obs : observers) {obs.update(currentWeather);}}
}
/*** 观察者接口*/
public interface WeatherObserver {/*** 更新方法** @param currentWeather 天气*/void update(String currentWeather);}
/*** 渔民观察者*/
public class FishermanObserver implements WeatherObserver {@Overridepublic void update(String currentWeather) {System.out.println("渔民收到的天气 = " + currentWeather);}
}
/*** 农场主观察者*/
public class FarmerObserver implements WeatherObserver {@Overridepublic void update(String currentWeather) {System.out.println("农场主收到的天气 = " + currentWeather);}
}
/*** 演示当天气改变了如何通知所有观察者(农民或渔民)* * @author July* @date 2020/10/20*/
public class App {public static void main(String[] args) {// 普通的观察者Weather weather = new Weather();weather.addObserver(new FishermanObserver());weather.addObserver(new FarmerObserver());// 改变天气,所有注册到目标观察者管理对象的观察者都会收到消息weather.setCurrentWeather("rainy day");}
}

角色说明

  • Subject(Weather):也叫被观察者,主要的对象,负责管理观察者和改变后通知观察者
  • Observer (WeatherObserver):观察者接口,所有观察者都需要实现
  • Concrete Observer(FishermanObserver、FarmerObserver):具体观察者的实现

优缺点

优点

  • 观察者和被观察者是抽象耦合的
  • 建立一套触发机制

缺点

  • 如果观察者太多,通知所有观察者需要花费比较多的时间
  • 观察者和被观察者有相互调用,可能会触发循环调用

扩展

对于有多个观察目标的情况,需要抽象出AbstractWeather,所有观察目标都实现AbstractWeather抽象类,一个观察者可以观察多个目标,一个目标可以被多个观察者观察

一文理解设计模式之--观察者模式(Observer)相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

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

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

  3. 锈才学设计模式之 —— 观察者模式(Observer Pattern)

    锈才学设计模式之  -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...

  4. 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)

    观察者模式(OBSERVER),又称发布-订阅(Publish-Subscribe),依赖(Dependents),通过定义对象间的一对多的依赖关系,达到当一个对象的状态发生改变时,所有依赖于它的对象 ...

  5. Android开发中常见的设计模式深入浅出——观察者模式Observer

    ##最近老大写的Android项目里用到了RxBus然后我就去百度了 让我先了解RxJava 然后RxJava又是由观察者模式的变种写的 所以打算从头学一遍!!! 观察者模式 Observer 顾名思 ...

  6. 设计模式之观察者模式(Observer)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 一文彻底搞懂观察者模式(Observer)

    文章已收录我的仓库:Java学习笔记与免费书籍分享 设计意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 在实际设计开发中,我们通常会降低 ...

  8. 一文理解设计模式之--策略模式(Strategy)

    首先定义一组算法,将每一个算法封装起来,从而使它们可以相互切换 使用场景 同样的流程,需要执行不同的策略算法,传入不同策略,执行传入对应的策略算法 代码示例 /*** Context持有Strateg ...

  9. 一文理解设计模式--命令模式(Command)

    命令模式(Command) 命令模式就是将命令包装成java对象,来保存命令历史记录和恢复上一个状态.重复执行命令,比如我们写代码的撤销(undo).取消撤销(redo) 适用场景 需要undo.re ...

最新文章

  1. 34.在排序数组中查找元素的起始和末尾位置
  2. BUUCTF(pwn)护网杯_2018_gettingstart
  3. 4 项目开发 - 后台
  4. hide show vue 动画_Vue2.x学习四:过渡动画
  5. 接上文 ,解决 虚拟机VM,U盘(磁盘)装有系统,将其中系统安装到另外一块磁盘的具体操作
  6. 今天的虎兄才跳了过去的飞秋WZ132
  7. Runnable案例 我赚钱她取钱案例 java1615475726
  8. C语言 关键字const的作用
  9. 小程序接口学习—开发接口
  10. 每天学一点Scala之 take、takeRight、takeWhile 与 filter
  11. 爬虫中无头浏览器如何选择
  12. 计算机主板时钟,电脑主板时钟电路工作原理
  13. GRPC入门使用及测试用例源码
  14. ROS端口映射这样才正确
  15. @ComponentScan注解
  16. 软件需求分析——需求基础
  17. 图片水印怎么去掉?图片水印去除方法
  18. 技术交流微信群欢迎小伙伴前来交流
  19. Light OJ - 1008 - Fibsieve`s Fantabulous Birthday 题解
  20. android 双电池,国外大神拆解腾讯ROG游戏手机5,双电池、中置主板结构、散热用料优秀...

热门文章

  1. VMWare虚拟机三种网络形式
  2. mvc 怎么把后台拼接好的div写到前台_五、controller层配置和前台数据crud操作的实现...
  3. mysql 分区表_MySQL 分区分表应用场景分析和分区中可能遇到的坑点
  4. 树莓派智能小车python_人工智能-树莓派小车(1)——DuerOS语音唤醒
  5. Struts 2 入门
  6. centos7新机器需要安装的。。。。。。
  7. ecshop3.0.0注入
  8. 人人都是 DBA(XI)I/O 信息收集脚本汇编(转)
  9. google站长管理工具
  10. python五行代码解决滑块验证的缺口距离识别,破解滑块验证...