设计模式学习笔记-观察者模式

上传人:第*** 文档编号:30575267 上传时间:2018-01-30 格式:DOCX 页数:10 大小:348.89KB
返回 下载 相关 举报
设计模式学习笔记-观察者模式_第1页
第1页 / 共10页
设计模式学习笔记-观察者模式_第2页
第2页 / 共10页
设计模式学习笔记-观察者模式_第3页
第3页 / 共10页
设计模式学习笔记-观察者模式_第4页
第4页 / 共10页
设计模式学习笔记-观察者模式_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《设计模式学习笔记-观察者模式》由会员分享,可在线阅读,更多相关《设计模式学习笔记-观察者模式(10页珍藏版)》请在金锄头文库上搜索。

1、 学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。观察者模式一、基本定义何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。观察者模式又称为发布 -订阅模式。二、基本结构首先先看观察者模式的 UML 类图。 分析:Subject:目标。他把所有对观察者对戏的引用保存在一个聚集里,每一个主题都可

2、以有多个观察者。Observer:观察者。为所有的具体观察者定义一个接口,在得到主题的通知时能够及时的更新自己。ConcreteSubject:具体主题。将有关状态存入具体观察者对象。在具体主题发生改变时,给所有的观察者发出通知。 ConcreteObserver:具体观察者。实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调。三、实现观察者模式情景是这样的:在气象观测站中,它能够追踪目前的天气状况,包括温度、适度、气压。需要实现一个布告板,能够分别显示目前的状态,气象统计和简单的预报。当气象站中获取最新的测量数据时,三种布告板必须实时更新。下面是这个案例的设计图: 编码实现

3、:主题接口 Subject.javajava view plaincopyprint?1. public interface Subject 2. /* 3. * 注册观察者 4. * param observer 5. */ 6. public void registerObserver(Observer observer); 7. 8. /* 9. * 删除观察者 10. * param observer 11. */ 12. public void removeOberver(Observer observer); 13. 14. /* 15. * 当主题状态发生改变时,这个方法需要被调

4、用,以通知所有观察者 16. */ 17. public void notifyObserver(); 18. 观察者接口 Observer.javajava view plaincopyprint?1. public interface Observer 2. public void update(float temp,float humidity,float pressure); 3. 布告板显示接口 DisplayElement.javajava view plaincopyprint?1. public interface DisplayElement 2. public void d

5、isplay(); 3. WeatherData 实现主题接口 WeatherData.javajava view plaincopyprint?1. 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

6、. Override 12. 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. t

7、his.tempterature = temperature; 41. this.humidity = humidity; 42. this.pressure = pressure; 43. measurementChanged(); 44. 45. 布告板 CurrentCondituonDisplay.javajava view plaincopyprint?1. public class CurrentConditionsDisplay implements Observer,DisplayElement 2. private float temperature; 3. private

8、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.

9、humidity = humidity; 14. display(); 15. 16. 17. Override 18. public void display() 19. System.out.println(Current conditions:+temperature+F degrees and +humidity+% humidity); 20. 21. 22. 测试程序 WeatherStationjava view plaincopyprint?1. public class WeatherStation 2. 3. public static void main(String a

10、rgs) 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.

11、运行过程四、观察者模式的优缺点优点:1、当两个对象之间送耦合,他们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间送耦合。主题所知道只是一个具体的观察者列表,每一个具体观察者都符合一个抽象观察者的接口。主题并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。2、观察者模式支持“广播通信”。主题会向所有的观察者发出通知。3、观察者模式符合“开闭原则”的要求。缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。2、 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进 行循环调用,可能导

12、致系统崩溃。3、 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。五、观察者模式的适用场所1、一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。3、一个对象必须通知其他对象,而并不知道这些对象是谁。需要在系统中创建一个触发链,A 对象的行为将影响 B 对象,B 对象的行为将影响 C 对象,可以使用观察者模式创建一种链式触发机制。总结1、观察者模式定义了对象之间的一

13、对多关系。多个观察者监听同一个被观察者,当该被观察者的状态发生改变时,会通知所有的观察者。 2、观察者模式中包含四个角色。主题,它指被观察的对象。具体主题是主题子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;观察者,将对观察主题的改变做出反应;具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。3、主题用一个共同的接口来更新观察者。4、观察者与被观察者之间用松耦合方式结合。5、有多个观察者时,不可以依赖特定的通知次序。6、使用观察者模式,可以从被观察者处推或者拉数据。该读书笔记的代码和部分语句均来自Head First 设计模式

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号