首页 > 其他分享 >观察者模式

观察者模式

时间:2022-12-03 14:14:42浏览次数:56  
标签:temp update 观察者 模式 humidity pressure 接口

没人疼就去健身,练完浑身疼。

让你的对象,知悉状况

自定义实现观察者模式

Internet气象观测站

应用就是利用WeatherData对象取得传感器数据,并更新三个布告板:目前状况、气象统计和天气预报。

WeatherData

先看一个错误示范

public class WeatherData {
// 实例变量声明

public void measurementsChanged() {
// 取得测量值
float temp = getTemperature();
float humidty = getHumidity();
float pressure = getpRESSURE();

// 调用每个布告板更新显示,传入最新的测量
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecasDisplay.update(temp, humidity, pressure);
}

// 其它方法
}

这样做有什么不对

  1. 违反设计原则,最好是把不变的部分和会改变的东西分别封装起来。

// 调用每个布告板更新显示,传入最新的测量
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecasDisplay.update(temp, humidity, pressure);

这部分可能会改变的东西,可以提出来单独封装。

  1. 针对接口编程,而不是针对实现编程,上面的update()参数都是温度、湿度、气压,看起来像是一个统一的接口。这样针对具体的实现编程,会导致我们以后在增加或删除布告板时必须修改程序。

出版者 + 订阅者 = 观察者模式

定义观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

结构类图

松耦合的威力

关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者具体类是谁,做了些什么或其它任何细节。改变主题或观察者其中一方,并不会影响另一方。因为两者是松耦合的,只要他们之间的接口仍被遵守,我们就可以自由地改变他们。

设计原则:

为了交互对象之间的松耦合设计而努力。

松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。

设计气象站

使用Java内置的封装类实现观察者模式

除了自定义接口实现观察者模式,还可以借助Java已经封装好的工具类来实现。

  • 优点:使用上更加方便,甚至可以使用推(push)或拉(pull)的方式传送数据。

  • 缺点:内置的观察者不是一个接口,而是一个类,你要使用的时候只能使用继承,但是java不支持多重继承,你要实现其他类的话,就会陷入矛盾。(而且内置的这套实现已经被官方标记弃用了,所以最好还是使用自定义接口的方式实现,更方便且更有弹性)

tips:

这里面使用了一个setChanged()方法用来标记状态已经改变的事实。有什么用呢?

使得代码更加有弹性,比方说,如果没有setChanged()方法,气象站的测量非常精确,每次温度值有十分之一度就开始更新数据,现在我希望半度以上才更新数据,就可以在温度到达半度时调用setChanged()方法,进行有效的数值更新。

总结

观察者模式——在对象之间定义一对多的依赖,这样一来,当一个对象改变状态依赖它的对象就会收到通知,并自动更新。

代码地址:

https://gitee.com/LHDAXIE/design-mode

标签:temp,update,观察者,模式,humidity,pressure,接口
From: https://www.cnblogs.com/l12138h/p/16947532.html

相关文章

  • Docker之Bridge网络模式应用
    Bridge是docker的默认网络模式,可直接用宿主机的物理网卡去访问外网。实战操作如下:1.新增一个bridge模式的网络,名称为test。网段为172.18.2.0/24dockernetworkcreate-dbr......
  • 深入浅出Seata的AT模式
    单个掉队,导致集体被动摆烂;一、业务背景在分布式架构中,事务管理是个无法避开的复杂问题,虽然有多种解决方案,但是需要根据业务去选择合适的;从个人最近几年的实践经验来看,S......
  • 3.工厂方法模式
    [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统......
  • 2.简单工厂模式
    [实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。......
  • 异地多活的三种架构模式
    业务定制型异地多活按照业务优先级排序,优先保证核心业务异地多活,根据核心业务的流程和数据,设计定制化的异地多活架构对基础设施无强要求不通用,难扩展C......
  • 装饰者模式
    装饰者模式星巴克咖啡订单项目:1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack(浓缩咖啡)、LongBlack(美式咖啡)、Decaf(无因咖啡)2)调料:Milk、Soy(豆浆)、Chocolat......
  • meta账号激活开发者模式
    meta账号激活开发者模式有两种方法:1.绑定信用卡2.绑定手机号,有两种渠道 2.1第一种如下图 进入下面的地址就可以看到setuptwo-factorauthenticati......
  • C# AES CFB加解密模式兼容JAVA
    C#AESCFB加解密模式兼容JAVA代码片段最近在和java做对接的时候老是遇到加密使用java写的,需要我们使用C#来解密相关数据,AES加解密平常也在用,但是这种跨语言的应用还是比较......
  • Oracle数据库体系结构更改数据库的归档模式
    重做日志文件负责实例失败时的数据恢复,因为SGA中没有被保存的数据会全部丢失,使用重做日志文件就可以完全恢复事务。而归档日志进程用于介质恢复,比如磁盘损坏时,可以使用之前......
  • vmware虚拟机三种网络模式(桥接、NAT、仅主机)带图详解
    文章目录说明三种网络模式介绍Bridge桥接模式说明设置vmware网络适配器虚拟机网络修改为桥接模式查看桥接物理网卡IP信息虚拟机中配置ip特殊说明NAT网络地址转换说明设置......