一、什么情况下考虑使用“观察者设计模式”?
观察者设计模式定义了对象之间的一对多的依赖关系,当主题对象改变状态时,它的所有观察者都会收到通知并且自动更新。
来具体分析一下下面的一个应用场景:
WeatherData为一个气象站提供的气象信息的实体类,当WeatherData中的信息发生变化时,需要让两个显示面板(CurrentConditionsDisplay和AnotherCondisDisplay)中相应的信息发生改变。这里我们就可以使用观察者设计模式。
观察者模式中的两个概念:
①主题(subject),一对多关系中的“一”端,也可以称为可观察对象。这里为WeatherData
②观察者(observer),一对多关系中的“多”端。这里为各种Display。
我们所要实现的功能就是当主题中的信息发生改变时可以通知所有的观察者,并让观察者做出相应的反应。
二、如何实现观察者模式?
①首先主题作为“一”端能够通知观察者的“多”端,所以主题中应当具有可以新增、删除观察者和通知观察者方法,所以就可以定义一个主题接口Subject如下:
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
②观察者作为“多”端,虽然各不相同,但是必须遵循一定的规则,主题才能使用面向接口的编程方法,来实现统一的调用,所以我们为观察定义了统一的改变数据的方法update(),如下:
public interface Observer { void update(double temperature, double humidity, double pressure); }
观察者如果需要遵循统一的展示接口,这里可以根据实际需要,自己来进行定义,我们定义了DisplayElement接口
public interface DisplayElement { public void display(); }
③在定义了上面的接口之后,主题中需要存储所有观察者的列表信息,并且能够根据观察者,进行自动的新建或者删除,所以我们可以在观察者的构造方法中调用主题的新增观察者方法,实现观察的新增如下:
public class CurrentConditionsDisplay implements Observer, DisplayElement{ private double temperature; private double humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData){ this.weatherData=weatherData; weatherData.registerObserver(this); } @Override public void display() { System.out.println("temperature: " + temperature); System.out.println("humidity:" + humidity); } @Override public void update(double temperature, double humidity, double pressure) { this.temperature=temperature; this.humidity=humidity; display(); } }
然后当主题的数据发生改变时可以循环调用观察者中的update()方法,实现联动。
java中也有内置的观察者模式,分别为:java.util.Observer和java.util.Observerable,只是Observer为接口,Observerable为主题的实现类,使用起来也比较的方便。
相关推荐
Java设计模式——观察者模式的两种情况。
浅析Java设计模式【1】——观察者!
《java设计模式》课后习题及模拟试题答案
对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...
KWIC 程序示例 事件风格 观察者模式的程序代码,使用的是Java语言。
22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...
java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...
设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
java设计模式期末大作业,运用了6种模式,包括简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式,文档包括系统流程,系统类图,各个模式的子类图,源代码,实验截图。绝对完整.
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计...