Java设计模式-观察者模式Observer

news/2023/6/9 19:34:52

在这里插入图片描述

介绍

观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在任何更改时得到通知时,观察者设计模式非常有用。在观察者模式中,观察另一个对象状态的对象被称为观察者,而被观察的对象则被称为主体。

优点

  1. 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。
  2. 这样,我们增加观察者(这里可以理解成一个新的公告板),就不需要去修改核心类 WeatherData 不会修改代码,遵守了 ocp 原则。

原理类图

  1. Subject:登记注册、移除和通知
  • registerObserver 注册
  • removeObserver 移除
  • notifyObservers() 通知所有的注册的用户,根据不同需求,可以是更新数据,让用户来取,也可能是实施推送, 看具体需求定
  1. Observer:接收输入
    在这里插入图片描述

实战案例

//观察者接口,有观察者来实现
public interface Observer {public void update(float temperature, float pressure, float humidity);
}
//接口, 让 WeatherData 来实现
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
/*** 类是核心 1. 包含最新的天气情况信息 2. 含有 观察者集合,使用 ArrayList 管理 3. 当数据有更新时,就主动的调用 ArrayList,* 通知所有的(接入方)就看到最新的信息* * @author Administrator**/
public class WeatherData implements Subject {private float temperatrue;private float pressure;private float humidity;//观察者集合private ArrayList<Observer> observers;//加入新的第三方public WeatherData() {observers = new ArrayList<Observer>();}public float getTemperature() {return temperatrue;}public float getPressure() {return pressure;}public float getHumidity() {return humidity;}public void dataChange() {//调用 接入方的 updatenotifyObservers();}//当数据有更新时,就调用 setDatapublic void setData(float temperature, float pressure, float humidity) {this.temperatrue = temperature;this.pressure = pressure;this.humidity = humidity;//调用 dataChange, 将最新的信息 推送给 接入方 currentConditionsdataChange();}//注册一个观察者@Overridepublic void registerObserver(Observer o) {observers.add(o);}//移除一个观察者@Overridepublic void removeObserver(Observer o) {if (observers.contains(o)) {observers.remove(o);}}//遍历所有的观察者,并通知@Overridepublic void notifyObservers() {for (int i = 0; i < observers.size(); i++) {observers.get(i).update(this.temperatrue, this.pressure, this.humidity);}}
}
public class CurrentConditions implements Observer {// 温度,气压,湿度private float temperature;private float pressure;private float humidity;// 更新 天气情况,是由 WeatherData 来调用,我使用推送模式public void update(float temperature, float pressure, float humidity) {this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;display();}// 显示public void display() {System.out.println("***Today mTemperature: " + temperature + "***");System.out.println("***Today mPressure: " + pressure + "***");System.out.println("***Today mHumidity: " + humidity + "***");}
}
public class BaiduSite implements Observer {private float temperature;private float pressure;private float humidity;public void update(float temperature, float pressure, float humidity) {this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;display();}public void display() {System.out.println("===百度网站====");System.out.println("***百度网站 气温 : " + temperature + "***");System.out.println("***百度网站 气压: " + pressure + "***");System.out.println("***百度网站 湿度: " + humidity + "***");}
}
public class Client {public static void main(String[] args) {//创建一个 WeatherDataWeatherData weatherData = new WeatherData();//创建观察者CurrentConditions currentConditions = new CurrentConditions();BaiduSite baiduSite = new BaiduSite();//注册到 weatherDataweatherData.registerObserver(currentConditions);weatherData.registerObserver(baiduSite);//测试System.out.println("通知各个注册的观察者, 看看信息");weatherData.setData(10f, 100f, 30.3f);weatherData.removeObserver(currentConditions);//测试System.out.println();System.out.println("通知各个注册的观察者, 看看信息");weatherData.setData(10f, 100f, 30.3f);}
}

JDK源码

  1. Jdk 的 Observable 类就使用了观察者模式
  2. 代码分析+模式角色分析:
    在这里插入图片描述
  3. 模式角色分析
  • Observable 的作用和地位等价于 我们前面讲过 Subject
  • Observable 是类,不是接口,类中已经实现了核心的方法 ,即管理 Observer 的方法 add… delete … notify…
  • Observer 的作用和地位等价于我们前面讲过的 Observer, 有 update
  • Observable 和 Observer 的使用方法和前面讲过的一样,只是 Observable 是类,通过继承来实现观察者模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4554905.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

史上最全金融产品架构分析四:信托公司

1.业务种类 信托业可以经营的业务项目依《信托投资公司管理办法》法可分为如下&#xff1a; &#xff08;1&#xff09;受托经营资金信托业务。即委托人将自己合法拥有的资金&#xff0c;委托信托投资公司按照约定的条件和目的&#xff0c;进行管理、运用和处分。 &#xff08…

一切技术创新史都是数据史

文/李根 ligenqbitai.com量子位 出品 | 公众号 QbitAI你可曾想过这样一个问题&#xff1a;如果以技术创新、科技发展而论&#xff0c;我们当前正处在一个怎样的周期&#xff1f;有按照热门技术领域的定义&#xff0c;比如这是一个AI、5G和区块链等交叉交融的时代。也有按照应用…

RPC框架泛调用原理及转转的实践

RPC框架泛化调用功能在网关、接口测试等场景下有着广泛的需求&#xff0c;本文给各位读者介绍一下主流的泛化调用实现方式及原理&#xff0c;比较各种实现方案的优缺点&#xff0c;并分享泛化调用在转转的实践。一方面有助于RPC框架使用方理解泛化调用&#xff0c;更好地使用泛…

读懂消费贷款之中国消费金融发展史

读懂消费贷款之中国消费金融发展史 本期让我们来了解以下中国消费金融的发展史吧~ 中国消费金融发展史大致可以分为四个阶段&#xff1a;萌芽期、试点期、发展期、规范期。 萌芽期&#xff08;1985-2009&#xff09; 主要提供服务方为商业银行和汽车金融公司。这个阶段主…

世界是部金融史

世界是部金融史 作者 : 陈雨露、杨栋 出版年: 2011-1页数: 286定价: 39.50元ISBN: 9787200085303历史、政治、经济&#xff0c;三门学科结合在一起讲&#xff0c;还讲的很有意思&#xff0c;一个下午看完&#xff0c;其中几点印象深刻&#xff1a;1. 中国历史中皇帝的集权过程…

VScode快速配置C/C++环境

文章目录我安装时仅参考了这两篇分享1.下载并安装VScode 商店C/C插件2.下载MinGW-W64 x86_64-win32-seh3.配置各种.json5.Hello_world.cpp测试我安装时仅参考了这两篇分享 伸手党进&#xff1a;具体步骤主要是这篇&#xff1a;Hudiscount-Vscode配置C/C环境 MinGW-W64 x86_64-…

与姬十三探讨如何42天搞定2500万美金投资,创业秘密都在这里

PMCAFF&#xff08;pmcaff.com&#xff09;&#xff1a;最大互联网产品社区&#xff0c;是百度&#xff0c;腾讯&#xff0c;阿里等产品经理的学习交流平台。定期出品深度产品观察&#xff0c;互联产品研究首选。还在遗憾错过分答发布会第一现场&#xff1f;在行分答深度报告读…

渣渣二本的辛酸面试之路~

点击上方“IT平头哥联盟”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;作者&#xff1a;jsonchao链接&#xff1a;https://juejin.im/post/5caf0f89f265da038145c66e一篇非常接地气的面试心得&#xff0c;作者也通过自己的努力&#xff0c;找到了不错的工作。…