意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
结构:
例子:
下面以模拟气象站系统来加以说明。
需求分析:
该系统的需求如下:
1、气象站能够追踪目前的天气状况,包括温度、湿度、气压、
2、气象站能够提供三种布告板,分别显示目前天气状况、气象统计和简单的预报。
3、布告板上的数据必须实时更新。
4、气象站必须提供一组API,供其他开发人员开发其他的布告板。
设计部分:
基于以上需求,该系统可以设计成3部分:气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前的天气状况给用户看)。效果图如下:
错误的类图设计(即没有学过设计模式时的第一感觉)可能如下:
相应的代码实现部分:
2 {
3 temperature = this.GetTemperature(); // 获得温度
4 humidity = this.GetHumidity(); // 获得湿度
5 pressure = this.GetPressure(); // 获得气压
6
7 MyCurrentConditionsDisplay.Update(temperature, humidity, pressure); // 更新目前天气状态板
8 MyStatisticsDisplay.Update(temperature, humidity, pressure); // 更新气象统计板
9 MyForcastDisplay.Update(temperature, humidity, pressure); // 更新天气预报板
10 }
这个类图设计的缺点:
1)、该设计是针对具体实现编程,而非针对接口。
2)、对于每个新的布告板,我们都得修改代码。
3)、我们无法在运动时动态得增加或删除布告板。
4)、我们尚未封装改变的部分。
那么如何改正这些缺点呢?
首先我们必须明白这些缺点的根源在哪里。很明显,我们在类图设计时依赖关系错了,应该依赖倒置。 CurrrentConditionsDisplay类、StatisticsDisplay类和ForcastDisplay类应该依赖 WeatherData类,而不是相反,这样就可以起到解耦的目的。
其次,CurrrentConditionsDisplay类、StatisticsDisplay类和ForcastDisplay类都有一个 Update()方法,因此应该提炼一个接口,这样可以实现“针对接口编程”,使代码更加灵活,也方便其他开发人员开发其他的布告板。
进一步思考:
1)、改正这些缺点后,我们的类图已经与观察者模式的结构有点类似了。
2)、我们的气象站系统的最大问题其实就是一对多的依赖引起的,而观察者模式正是解除一对多关系的不二法门,因此我们有必要采用观察者模式。
采用了观察者模式后设计的类图应该是这样:
WeatherDatea实现ISubject接口,CurrentConditionsDisplay、ForcastDisplay、 StatisticsDisplay实现IObserver接口,ISubject调用 IObserver,CurrentConditionsDisplay、ForcastDisplay、StatisticsDisplay调用 ISubject。
相应的代码实现部分:
2 {
3 private float temperature;
4 private float humidity;
5 private float pressure;
6 private List<IObserver> myList = new List<IObserver>();
7
8 public void SetWeatherData(float paramTemp, float paramHumidity, float paramPressure)
9 {
10 this.temperature = paramTemp;
11 this.humidity = paramHumidity;
12 this.pressure = paramPressure;
13 MeasurementsChanged();
14 }
15
16 public void MeasurementsChanged()
17 {
18 this.NotifyObservers();
19 }
20
21 public void RegisterObserver(IObserver paramIObserver)
22 {
23 myList.Add(paramIObserver);
24 }
25
26 public void RemoveObserver(IObserver paramIObserver)
27 {
28 myList.Remove(paramIObserver);
29 }
30
31 public void NotifyObservers()
32 {
33 foreach (IObserver observer in myList)
34 {
35 observer.Update(temperature, humidity, pressure);
36 }
37 }
38 }
发表评论
-
《Head.First设计模式》的学习笔记(17)-综合例子
2012-02-12 00:53 0例子: -
《Head.First设计模式》的学习笔记(16)--复合模式
2012-02-12 00:51 0意图: -
《Head.First设计模式》的学习笔记(15)--代理模式
2012-02-13 00:03 1164意图: 为另一个对象提供一个替身或占位符得以访问这个对象。 ... -
《Head.First设计模式》的学习笔记(14)--状态模式
2012-02-12 20:24 1244意图:允许对象在内部状态改变时改变她的行为,对象看起来好像修改 ... -
《Head.First设计模式》的学习笔记(13)--组合模式
2012-02-12 17:49 846先说一下题外话,这个模式是我学的最累的模式,代码纠结无比,而且 ... -
《Head.First设计模式》的学习笔记(12)--迭代器模式
2012-02-12 15:30 758意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不 ... -
《Head.First设计模式》的学习笔记(11)--模板方法模式
2012-02-12 00:46 884意图:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中 ... -
《Head.First设计模式》的学习笔记---前言
2012-02-11 23:36 0headfist系列博客从这篇--模版方法模式开始自己写的了, ... -
《Head.First设计模式》的学习笔记(10)--外观模式
2012-02-11 23:30 677意图:为子系统中的一组接口提供一个一致的界面,Facade ... -
《Head.First设计模式》的学习笔记(9)--适配器模式
2012-02-11 23:27 746软件开发中经常遇到的 ... -
《Head.First设计模式》的学习笔记(8)--命令模式
2012-02-11 22:55 741背景:有时候我们需要对方法进行封装,通过对这些封装的方法进行调 ... -
《Head.First设计模式》的学习笔记(7)--单件模式
2012-02-11 13:55 929背景:有一些对象其实我们只需要一个,比方说:线程池(threa ... -
《Head.First设计模式》的学习笔记(6)--抽象工厂模式
2012-02-11 13:37 853意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要明 ... -
《Head.First设计模式》的学习笔记(5)--工厂方法模式
2012-02-10 23:58 763意图:定义一个用于创建对象的接口,让子类决定实例化哪一 ... -
《Head.First设计模式》的学习笔记(4)--装饰者模式
2012-02-10 23:40 809意图:动态地将责任 ... -
《Head.First设计模式》的学习笔记(2)--策略模式
2012-02-10 23:09 634先对策略模式有一个总体认识。 意图:定义一系列的算法,把它们 ... -
《Head.First设计模式》的学习笔记(1)
2012-01-31 21:53 7891、慢一点,你理解的越 ...
相关推荐
总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...
在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...
《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式这一核心编程概念。设计模式是经过实践验证的解决方案模板,用于解决在软件开发中经常遇到的问题,尤其在面向对象设计中。这篇...
《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...
通过以上对“Head First设计模式”书中可能涉及的设计模式的介绍,我们可以看出这本书是学习面向对象设计模式的绝佳资源。无论是初学者还是有一定经验的开发人员,都能从中受益匪浅。理解并熟练运用这些模式能够帮助...
在Head First的观察者模式学习笔记中,我们可以深入理解这个模式的原理和应用。首先,观察者模式涉及到两个主要的角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何具有可变状态的对象...
在C#编程中,事件是实现对象间通信的重要机制,特别是在设计模式中,如观察者模式。本学习笔记将深入探讨如何在C#中创建事件,以实现一个棒球模拟系统的例子。在这个系统中,我们将关注投球手、观众和裁判的交互,当...
3. MongoDB学习:`MongoDB 学习笔记.txt` 涉及NoSQL数据库MongoDB的使用,包括文档型数据库的基本操作、集合、查询、索引、聚合框架等。MongoDB是用于处理大量非结构化数据的强大工具,特别适合大数据和实时分析场景...
8. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式,提升代码质量和可维护性。 9. **JVM原理**:理解Java虚拟机的工作方式,包括内存管理、垃圾回收机制等。 10. **Spring框架**:掌握流行的...