观察者模式

来源:互联网 发布:收光28网络会丢包吗 编辑:程序博客网 时间:2024/06/06 08:46

几个月之前大致的看了一下《大话设计模式》这本书,对其中的观察者模式有过了解,最近的项目中正好使用过,故此就当复习一遍。所谓温故而知新!

首先,什么是观察者模式?

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在发生变化时会通知所有观察者对象,使他们自动更新当一个对象变化时, 其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

说了这么多还不如打个比方来加深理解。
例如:在一次珠宝展会中,展出的珠宝就是一个被监听的主体对象。有一批安保负责管理珠宝的安全问题,有一批盗贼想抢劫这个珠宝,于是,安保和盗贼就是其中的观察者。
于是将安保和盗贼抽象出来为观察者,珠宝为被监听的主题对象。
观察者模式

通过类图可以看出被观察者主要有三个方法用于注册观察者,卸载观察者,通知操作。
观察者主要有处理通知的操作。

上代码:

/** * 被观察者,被监听的资源 * @author root * */public interface Subject {    /**     * 注册观察者对象     * @param observer     */    public void register(Observer observer);    /**     * 解除关系     * @param observer     */    public void detach(Observer observer);    /**     * 通知观察者     */    public void notifyAllObserver();}
/** * 观察者模式: *  * 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象, * 这个主题对象在发生变化时会通知所有观察者对象,使他们自动更新当一个对象变化时, * 其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系 *  * @author root * *///抽象观察者,主要处理被观察者状态发生改变时所对应的操作public interface Observer {public void doHandler();}/** * 观察者一:警察负责珠宝安全 * @author root * */public class PoliceObserver implements Observer {    @Override    public void doHandler() {        System.out.println("警察在旁边观察珠宝......");    }
/** * 观察者二:小偷,想偷珠宝 * @author root * */public class ThiefObserver implements Observer {    @Override    public void doHandler() {        System.out.println("小偷打算偷珠宝。。。。");    }}
/** * 被观察的资源。 * @author root * */public class DiamondSubject implements Subject {    //一对多的依赖关系,让多个观察者对象同时监听某一个主体对象    private List<Observer> observers;    public DiamondSubject(){        if(observers == null){            observers = new ArrayList<Observer>();        }    }    @Override    public void register(Observer observer) {        observers.add(observer);    }    @Override    public void detach(Observer observer) {        observers.remove(observer);    }    @Override    public void notifyAllObserver() {        //通知观察者作出对应操作        for(Observer o : observers){            o.doHandler();        }    }}
public class TestObserver {    public static void main(String[] args) {        Subject s = new DiamondSubject();        Observer o1 = new PoliceObserver();        Observer o2 = new ThiefObserver();        s.register(o1);        s.register(o2);        s.notifyAllObserver();    }}

小结:
观察者模式主要在于在被观察者一方维护了了多个观察者对象,当被观察者状态变化时会通过特定方法(在上例中notifyAllObserver方法)通知观察者做出对应操作。