




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
设计模式读书笔记-观察者模式 学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。 观察者模式 一、基本定义 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。 在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。 观察者模式又称为发布-订阅模式。 二、基本结构 首先先看观察者模式的UML类图。 分析: Subject:目标。他把所有对观察者对戏的引用保存在一个聚集里,每一个主题都可以有多个观察者。 Observer:观察者。为所有的具体观察者定义一个接口,在得到主题的通知时能够及时的更新自己。 ConcreteSubject:具体主题。将有关状态存入具体观察者对象。在具体主题发生改变时,给所有的观察者发出通知。 ConcreteObserver:具体观察者。实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调。 三、实现观察者模式 情景是这样的:在气象观测站中,它能够追踪目前的天气状况,包括温度、适度、气压。需要实现一个布告板,能够分别显示目前的状态,气象统计和简单的预报。当气象站中获取最新的测量数据时,三种布告板必须实时更新。 下面是这个案例的设计图: 编码实现: 主题接口 Subject.java1 public interface Subject 2 /* 3 * 注册观察者 4 * param observer 5 */ 6 public void registerObserver(Observer observer); 7 8 /* 9 * 删除观察者10 * param observer11 */12 public void removeOberver(Observer observer);13 14 /*15 * 当主题状态发生改变时,这个方法需要被调用,以通知所有观察者16 */17 public void notifyObserver();18 观察者接口 Observer.java1 public interface Observer 2 public void update(float temp,float humidity,float pressure);3 布告板显示接口 DisplayElement.java1 public interface DisplayElement 2 public void display();3 WeatherData实现主题接口 WeatherData.java1 public class WeatherData implements Subject 2 private List observers; 3 private float tempterature; 4 private float pressure; 5 private float humidity; 6 7 public WeatherData() 8 observers = new ArrayList(); 9 10 11 Override12 public void notifyObserver() 13 for(int i = 0; i = 0)28 observers.remove(i);29 30 31 32 /*33 * 气象站得到更新的观测数据时,通知观察者34 */35 public void measurementChanged()36 notifyObserver();37 38 39 public void setMeasurements(float temperature,float humidity,float pressure)40 this.tempterature = temperature;41 this.humidity = humidity;42 this.pressure = pressure;43 measurementChanged();44 45 布告板 CurrentCondituonDisplay.java1 public class CurrentConditionsDisplay implements Observer,DisplayElement 2 private float temperature; 3 private float humidity; 4 private Subject weatherData; 5 6 public CurrentConditionsDisplay(Subject weatherData) 7 this.weatherData = weatherData; 8 weatherData.registerObserver(this); /注册观察者 9 10 11 public void update(float temp, float humidity, float pressure) 12 this.temperature = temp;13 this.humidity = humidity;14 display();15 16 17 Override18 public void display() 19 System.out.println(Current conditions:+temperature+F degrees and +humidity+% humidity);20 21 22 测试程序 WeatherStation1 public class WeatherStation 2 3 public static void main(String args) 4 WeatherData weatherData = new WeatherData(); 5 6 CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData); 7 8 weatherData.setMeasurements(80, 65, 30.4f); 9 weatherData.setMeasurements(82, 70, 29.2f);10 weatherData.setMeasurements(78, 78, 40.4f);11 12 运行过程 四、观察者模式的优缺点 优点: 1、当两个对象之间送耦合,他们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间送耦合。主题所知道只是一个具体的观察者列表,每一个具体观察者都符合一个抽象观察者的接口。主题并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。 2、观察者模式支持“广播通信”。主题会向所有的观察者发出通知。 3、观察者模式符合“开闭原则”的要求。 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进 行循环调用,可能导致系统崩溃。 3、 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 五、观察者模式的适用场所 1、一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 3、一个对象必须通知其他对象,而并不知道这些对象是谁。需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象,可以使用观察者模式创建一种链式触发机制。 总结 1、观察者模式定义了对象之间的一对多关系。多个观察者监听同一个被观察者,当该被观察者的状态发生改变时,会通知所有的观察者。 2、观察者模式中包含四个角色。主题,它指被观察的对象。具体主题是主题子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;观察者,将对观察主题的改变做出反应;具体观察
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人协议用工范文
- 脑梗塞康复护理健康教育
- 2025年事业单位工勤技能-湖南-湖南地质勘查员三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北行政岗位工四级(中级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北检验员四级(中级工)历年参考题库典型考点含答案解析
- 2025年医药电商平台医药电商保险与合规监管报告
- 2025年事业单位工勤技能-湖北-湖北护理员五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北地图绘制员五级(初级工)历年参考题库典型考点含答案解析
- 2025-2030中国素颜霜市场需求状况及销售模式预测分析报告
- 2025年事业单位工勤技能-浙江-浙江药剂员一级(高级技师)历年参考题库含答案解析(5套)
- 应聘个人简历标准版范文
- 2025年中国智慧养殖行业市场占有率及投资前景预测分析报告
- 全面深化信息安全培训提高医护人员的保护意识与能力水平
- 2025-2030中国工业CT行业市场运行分析及发展趋势与投资研究报告
- 废气处理合同协议
- 肿瘤科实习生护理小讲课
- 劳动教育校本课程研究(8篇)
- 2025-2030中国余热回收行业市场现状供需分析及投资评估规划分析研究报告
- 2025小红书商业影像婚美行业峰会
- GB/T 45304-2025干欧芹
- 高考改革生物培训
评论
0/150
提交评论