教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

设计模式 - 观察者模式

来源:网络收集 时间:2026-10-02
导读: 设计模式 设计模式读书笔记-----观察者模式 学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。 观察者模式 一、基本定义 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变

设计模式

设计模式读书笔记-----观察者模式

学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。

观察者模式

一、基本定义

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

在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。

观察者模式又称为发布-订阅模式。

二、基本结构

首先先看观察者模式的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字,全部文档内容请下载后查看。喜欢就下载吧 ……

设计模式 - 观察者模式.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/2324022.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)