今天这个模式,也是面试的时候问到的。其实这个模式最好理解。
观察者,与被观察的物体,订阅者,与被订阅(发布)者。
着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML:
一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。
每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。
首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。
public interface WeatherServiceInterface {
public void subscribeWeatherService(Observer obs);
public void unsubscribeWeatherService(Observer obs);
public void notifyObserver(Object obj);
}
这个类名字长了点。不过方便我们读懂。呵呵。这个接口,提供给可以被订阅的天气。
现在实现一个可以报告温度的天气吧。
public class WeatherServiceImpl implements WeatherServiceInterface {
public List<Observer> observers;
public float temprature;
public float getTemprature() {
return temprature;
}
public void setTemprature(float temprature) {
if(this.temprature != temprature){
this.temprature = temprature;
this.notifyObserver(this);
}
}
public WeatherServiceImpl(){
this.observers = new ArrayList<Observer>();
}
@Override
public void subscribeWeatherService(Observer obs) {
// TODO Auto-generated method stub
observers.add(obs);
}
@Override
public void unsubscribeWeatherService(Observer obs) {
// TODO Auto-generated method stub
observers.remove(obs);
}
@Override
public void notifyObserver(Object obj) {
// TODO Auto-generated method stub
for(Observer obs:observers){
obs.update(obj);
}
}
}
非常的清晰。根据接口,我们的实现也非常简洁。在设置温度的时候,如果温度发生了改变,将通知所有注册的观察者。
现在我们来看看观察者:
public interface Observer {
public void update(Object obj);
}
一个观察者,需要提供一个接口,让被观察者调用。实现更新。
现在我们有个数据模型,需要根据温度改变而改变他的数据。
public class WeatherModel implements Observer{
public String name;
public float temprature;
public WeatherModel(String name){
this.name = name;
}
@Override
public void update(Object obj) {
// TODO Auto-generated method stub
temprature =((WeatherServiceImpl)obj).getTemprature();
System.out.println(name + " update temprature to : "+ temprature);
}
}
这里加入一个name,以便区分不同的订阅者。测试一下:
public class Test {
public static void main(String [] args){
WeatherServiceImpl wsi = new WeatherServiceImpl();
Observer obs1 = new WeatherModel("lily");
Observer obs2 = new WeatherModel("lucy");
wsi.subscribeWeatherService(obs1);
wsi.subscribeWeatherService(obs2);
wsi.setTemprature(20F);
try{
Thread.sleep(2);
}catch(InterruptedException e){}
wsi.setTemprature(22.30F);
}
}
结果:
lily update temprature to : 20.0
lucy update temprature to : 20.0
lily update temprature to : 22.3
lucy update temprature to : 22.3
每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。
- 大小: 5.5 KB
分享到:
相关推荐
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
设计模式(19)-Observer Pattern 设计模式(18)-Command Pattern 设计模式(17)-Chain of Responsibility Pattern 设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight...
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
设计模式培训-observer
当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响其他对象的行为 l 订阅对象:当主题对象发生改变,订阅对象需要相应处理...
第 2 章 实例研究:设计一个文档编辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 272.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor 和 Composition 27 2.3.3 ...
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装在独立的对象中以使...
观察者设计模式观察者<Observer>模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标...
设计模式精解-GoF 23种设计模式解析附C++实现源码 AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式
Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
同时包含一个 , 和实现。 故事书演示: : 产品特点 :fishing_pole: 挂钩或组件API-使用useInView ,监视元素比以往任何时候都更加容易 :high_voltage: 优化的性能-尽可能重用交叉口观察者实例 :gear_selector: ...
设计模式C++学习之观察者模式(Observer)
设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...
Vue调整大小观察器 English |安装Vue3.0 npm install --save vue-resize-observer@next Vue2.0 npm install --save vue-resize-observer 模块导入和示例导入软件包并将其安装到Vue中: const VueResizeObserver = ...
第二章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.3 格式化 2.4 修饰用户界面 2.5 支持多种视感标准 2.6 支持多种窗口系统 2.7 用户操作 2.8 拼写检查和断字处理 2.9 小结 第三章 创建型模式 3.1 ...
设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................