设计模式 - 观察者模式
设计模式
设计模式读书笔记-----观察者模式
学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。
观察者模式
一、基本定义
何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。
在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。
观察者模式又称为发布-订阅模式。
二、基本结构
首先先看观察者模式的UML类图。
设计模式
分析:
Subject:目标。他把所有对观察者对戏的引用保存在一个聚集里,每一个主题都可以有多个观察者。
Observer:观察者。为所有的具体观察者定义一个接口,在得到主题的通知时能够及时的更新自己。
ConcreteSubject:具体主题。将有关状态存入具体观察者对象。在具体主题发生改变时,给所有的观察者发出通知。
ConcreteObserver:具体观察者。实现抽象观察者角色所要
设计模式
求的更新接口,以便使本身的状态与主题状态相协调。
三、实现观察者模式
情景是这样的:在气象观测站中,它能够追踪目前的天气状况,包括温度、适度、气压。需要实现一个布告板,能够分别显示目前的状态,气象统计和简单的预报。当气象站中获取最新的测量数据时,三种布告板必须实时更新。
下面是这个案例的设计图:
编码实现:
主题接口 Subject.java
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 * 当主题状态发生改变时,这个方法需要被调用,以通知所有观察者
16 */
17 public void notifyObserver();
18 }
观察者接口 Observer.java
1 public interface Observer {
2 public void update(float temp,float humidity,float pressure);
3 }
布告板显示接口 DisplayElement.java
1 public interface DisplayElement {
2 public void display();
3 }
WeatherData实现主题接口 WeatherData.java
1 public class WeatherData implements Subject{
2 private List<Observer> observers;
3 private float tempterature;
4 private float pressure;
5 private float humidity;
6
7 public WeatherData(){
8 observers = new ArrayList<Observer>();
9 }
10
11 @Override
12 public void notifyObserver() {
设计模式
13 for(int i = 0; i < observers.size();i++){
14 Observer observer = observers.get(i);
15 observer.update(tempterature, humidity, pressure);
16 }
17 }
18
19 @Override
20 public void registerObserver(Observer observer) {
21 observers.add(observer);
22 }
23
24 @Override
25 public void removeOberver(Observer observer) {
26 int i = observers.indexOf(observer);
27 if(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.java
1 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 @Override
18 public void display() {
19 System.out.println("Current conditions:"+temperature+"F degrees and "+humidity+"% humidity");
20 }
21
22 }
测试程序 WeatherStation
1 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、 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进 行循环调用 …… 此处隐藏:2375字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




