设计模式-观察者模式

来源:互联网 发布:贴吧人肉软件 编辑:程序博客网 时间:2024/06/08 05:20

观察者模式
what(是什么)
当一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。列如: 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
why(为什么用它)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
how(怎么用)
使用面向对象技术,可以将这种依赖关系弱化。

package observable;import java.util.Observable;/** * 被观察者 * */public class House extends Observable {    private float price;    public House(float price) {        super();        this.price = price;    }    public float getPrice() {        return price;    }    public void setPrice(float price) {        super.setChanged();// 设置变化点        super.notifyObservers(price);// 通知所有观察者价格改变        this.price = price;    }    @Override    public String toString() {        return "House [price=" + price + "]";    }}package observable;import java.util.Observable;import java.util.Observer;/** * 观察者 * */public class HousePriceObserver implements Observer{    private String name;    public HousePriceObserver(String name) {        super();        this.name = name;    }    @Override    public void update(Observable o, Object arg) {        if(arg instanceof Float){            System.out.println(this.name+"观察到价格更改为:");            System.out.println(arg);        }    }}package observable;public class Demo {    public static void main(String[] args) {        House h = new House(100000000);        HousePriceObserver hp1 = new HousePriceObserver("购房者A");        HousePriceObserver hp2 = new HousePriceObserver("购房者2");        h.addObserver(hp1);        h.addObserver(hp2);        System.out.println(h);        h.setPrice(6666666);        System.out.println(h);    }}

结果:
House [price=1.0E8]
购房者2观察到价格更改为:
6666666.0
购房者A观察到价格更改为:
6666666.0
House [price=6666666.0]

注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

阅读全文
0 0