设计模式--观察者模式
2020-07-06 10:10:17 0 举报
观察者模式 发布/订阅模式 Head first设计模式 第二章
作者其他创作
大纲/内容
气压感应器
状态改变
观察者模式(发布/订阅模式):定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。用于为对象实现发布/订阅功能。
案例:气象观测站
注册
设计原则:为了交互对象之间的松耦合设计而努力。
主题对象(更新)
所有的潜在观察者都需要实现这个接口,主题更新时会调用update()方法
Subject
registerObserver()removeObserver()notifyObserver()
WeatherData
ArrayList observers //观察者列表
registerObserver()removeObserver()notifyObserver()getTemperature()getHumidity()getPressure()measurementsChanged()
OO原则为交互对象之间的松耦合设计而努力
气象站工作图
改良设计(观察者模式):松耦合
观察者
主题接口,对象用此接口 注册为观察者,或把自己从观察者中删除。
通知
WeatherData对象
布告板
温度感应器
定义观察者模式:出版者+订阅者
Observer
update()
ForecastDisplay
update()display(){ //显示天气预报}
案例描述:此气象观测系统包含3个部分,气象站(获取数据),weatherData对象(跟踪数据并跟新布告板),布告板(显示天气)。1.WeatherData类具有getter方法,可以获取三个测量值:温度、湿度和气压。2.当新的测量数据备妥时,measurementsChanged()方法就会被调用。3.需要实现三个布告板,\"目前状况\"布告板,\"气象统计\"布告板,\"天气预报\"布告。4.系统必须可以扩展,让其他开发人员定制布告板
ConcreteObserver
update()//其他观察者的具体方法
一个具体主题,实现了主题接口。除了注册和撤销方法,还实现了notifyObserver()方法,用于状态改变时更新所有当前观察者
原始设计:直接在原来的类写方法
观察者工作原理
气象站系统实现类图:
displayElement.java //显示接口public interface DisplayElement { public void display();}
CurrentConditionsDisplay
update()display(){ //显示当前观测值}
获取数据
subject.java //主题接口public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers();}
代码(java实现)
DisplayElement
display()
ThirdPartyDisplay
update()display(){ //显示基于观测值的其他内容}
主题
湿度感应器
OO模式观测者模式——在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新
主题对象
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。订阅发布关系。如何解决:使用面向对象技术,可以将这种依赖关系弱化。关键代码:在抽象类里有一个 ArrayList 存放观察者们。应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
ConcreteSubject
registerObserver()removeObserver()notifyObserver()getState()setState()
一个具体的观察者,必须实现update()接口,以便接收主题消息。
许多观察者
StatisticsDisplay
update()display(){ //显示最小。平均和最大的观测值}
UML类图:
气象站
显示
缺点:针对具体实现编程,会导致以后增加或删除布告板时必须修改程序。高耦合
0 条评论
下一页