业务需求:希望建立下一代Internet气象观测站!该气象站必须建立在我们专利申请中的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。要求:建立一个应用,有三种布告板,分别显示目前的状况,气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。而且,这是一个可以扩展的气象站,Weather-O-Rama气象站希望能有一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中。接下来看WeatherDate类
先看一个错误的示范
我们的实现有什么不对呢,仔细想想oo的设计原则就知道了
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
这里针对了具体实现编程,会使我们在增加或删除布告板时必须修改程序,而且布告板的方法都是update,至少这里看起来应该像是一个统一的接口。改变的地方需要封装滴。。。。
那么先让我们认识一下观察者模式吧,报纸订阅的方式估计大家都能想明白,如果你明白报纸订阅是怎么回事,那么恭喜你,你已经明白观察者模式是怎么回事了。 出版者+订阅者=观察者模式,把名称改一下吧,改的专业一点,出版者改成 主题(Subject), 订阅之改成 观察者(Observer),改后 主题(Subject)+观察者(Observer)=观察者模式(Observer),那么根据报纸的订阅方式可以给观察者模式下定义了:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。稍后你会看到实现观察者模式的方法不止一种,但是以包含Subject和Observer接口的类设计的做法最常见。下面是观察者模式的类图,直接截的图:
观察者模式提供了一种对象设计,让主题和观察者之间松耦合(解耦合),我们可以独立的复用主题或观察者,因为二者并非紧耦合,只要他们之间的接口仍被遵守,我们就可以自由的改变他们。由此,我们又碰到一个设计原则:为了交互对象之间的松耦合(解耦合)设计而努力。OK 看过观察者模式了,那么开始设计气象站吧,设计图如下:
根据上面的类图,来实现气象站吧,先从建立接口开始,代码如下:
继续在WeatherData中实现主题接口
:
接下来建立布告板:
最后可以建立一个测试程序来看我们的劳动成果了:
到此,气象站算初步完成了。但是 Java API 有内置的观察者模式。java.util包内包含最基本的Observer接口与Observable类,这和我们的Subject接口与Observer接口很类似,Observer接口与Observable类使用起来更方便,因为许多功能都已经事先准备好了,上面我们自己实现的只是使用推(push)传送数据,但在内置的模式中可以使用推(push)或拉(pull)的方式传送数据。使用内置的观察者模式重新设计气象站:
我们再做一次气象站,但这次用拉(pull)来传送数据。首先,把WeatherDate改成使用java.util.Observable:
现在也让我们重做CurrentConditionsDisplay:
运行WeatherStation.java再次进行测试。。。。不知你注意到了吗,可观察者是一个“类”而不是一个“接口“,违反了针对接口编程,而非针对实现编程。如果你看看Observable的API,你会发现setChanged()方法被保护起来了(被定义成了protected),这意味着:除非你继承自Observable,否则无法创建Observable实例并组合到你自己的对象中来。这个设计违反了:多用组合,少用继承。但是当你熟悉观察者模式之后这一切都不是问题,你可以自己实现的,选择权在于你。其实,并非只有在java.util中才能找到观察者模式,其实在JavaBeans和Swing中,也都实现了观察者模式。
分享到:
相关推荐
设计模式C++学习之观察者模式(Observer)
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063
观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
主要介绍了PHP设计模式之观察者模式(Observer)详细介绍和代码实例,需要的朋友可以参考下
observer观察者模式
C#面向对象设计模式 (行为型模式) Observer 观察者模式 视频讲座下载
1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...
16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. ...