设计模式-观察者模式
来源:互联网 发布:19楼网络股份有限公司 编辑:程序博客网 时间:2024/06/16 09:21
观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
public interface Subject { public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers();}public interface Observer { public void update(float temp, float humidity, float perssure);}public interface Display { public void display();}public class WeatherData implements Subject { private float temp; private float humidity; private float perssure; List<Observer> observers = new ArrayList<Observer>(); @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if(index >= 0){ observers.remove(index); } } @Override public void notifyObservers() { for(Observer observer : observers){ observer.update(temp, humidity, perssure); } } public void setMersureMents(float temp, float humidity, float perssure){ this.temp = temp; this.humidity = humidity; this.perssure = perssure; mersureMentsChange(); } private void mersureMentsChange() { notifyObservers(); }}public class MyDisplay implements Observer, Display { private float temp; private float humility; private float perssure; private Subject weatherData; public MyDisplay(Subject weatherData) { super(); this.weatherData = weatherData; weatherData.addObserver(this);; } @Override public void display() { System.out.println("MyDisplay: temp=" + temp + ", humility=" + humility + ", perssure=" +perssure); } @Override public void update(float temp, float humidity, float perssure) { this.temp = temp; this.humility = humidity; this.perssure = perssure; display(); } public void out(){ weatherData.removeObserver(this); }}public class CurrentConditionDisplay implements Observer, Display { private float temp; private float humility; private Subject weatherData; public CurrentConditionDisplay(Subject weatherData) { super(); this.weatherData = weatherData; weatherData.addObserver(this);; } @Override public void display() { System.out.println("CurrentConditionDisplay: temp=" + temp + ", humility=" + humility); } @Override public void update(float temp, float humidity, float perssure) { this.temp = temp; this.humility = humidity; display(); } public void out(){ weatherData.removeObserver(this); }}public class ObserverTest { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); MyDisplay myDisplay = new MyDisplay(weatherData); CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData); weatherData.setMersureMents(10, 20, 30); weatherData.setMersureMents(10.5f, 20.5f, 30.5f); myDisplay.out(); weatherData.setMersureMents(10.6f, 20.6f, 30.6f); }}
阅读全文
0 0
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- 单纯形法简介
- Ubuntu svn diff tool
- jdk1.6_02和tomcat6.0_37版本兼容问题
- Windows程序设计学习笔记二——输出文字及滚动列
- 关于函数形参和实参关系的理解
- 设计模式-观察者模式
- 三种Java下生成PDF方式的比较
- 前馈神经网络与深度学习概述
- redis 无法远程链接
- scikit-learn(1)
- Java中的并发工具类
- coreData
- 面试题35. 第一个只出现一次的字符
- angular4的rollup