设计模式-观察者模式

来源:互联网 发布: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);    }}