深入理解观察者模式(二)

来源:互联网 发布:软件生命周期模型定义 编辑:程序博客网 时间:2024/06/05 07:40

在深入理解观察者模式(一)中,我曾经提过在观察者模式中如果被观察目标和观察者之间是一对多的关系,那么我们在对被观察者目标进行设计时就必须尽量符合单一职责原则,也就是要做到让所有观察者响应相同的改变。如果被观察者目标有多种改变响应多种类别的观察者,那么要嘛对被观察者目标进行拆分,不同的改变被拆分到不同类里面,再各自实现自己的观察者模式,要嘛如果不拆分的话就得让被观察目标依赖多组观察者集合,不同组观察者集合响应不同的改变,但是我更偏向于第一种方法,设计符合单一职责原则的类可以有很多的好处,当然这也要根据具体情况具体分析,我就不再多述了。

今天我要讲一种简化版的观察者模式,即观察目标与观察者是一对一的关系。

先来看看类图(接口实现):

这里写图片描述

Subject:抽象主题类,被观察目标的抽象层。这里用接口实现,用来定义被观察目标的行为,有注册观察者,删除观察者,通知观察者更新三种行为。
Observer:观察者。这里的update方法只传递一个object对象,并不把观察目标的引用传递过来,所以观察者就不依赖于具体观察目标了。
ConcreteSubject:具体观察目标。
ConcreteObserver:具体观察者。

看看代码实现:

package com.observer.simple.in;/** * 抽象主题接口,定义行为 * @author hyh * */public interface Subject {    /**     * 注册观察者     * @param o:抽象观察者     */    public void registerObserver(Observer o);    /**     * 移除观察者     * @param o     */    public void removeObserver();    /**     * 通知观察者更新     */    public void notifyUpdate();}
package com.observer.simple.in;/* * 抽象观察者接口 */public interface Observer {    /**     * 更新操作     */    public void update(Object o);}
package com.observer.simple.in;public class ConCreteSubject implements Subject {    private boolean changed;//标志是否发生了变化    private Observer observer;    @Override    public void notifyUpdate() {        if(changed){            if(observer!=null){                observer.update(null);            }        }    }    @Override    public void registerObserver(Observer observer) {        this.observer=observer;    }    @Override    public void removeObserver() {        this.observer=null;     }    public boolean isChanged() {        return changed;    }    public void setChanged(boolean changed) {        this.changed = changed;    }}
package com.observer.simple.in;public class ConcreteObserver implements Observer {    @Override    public void update(Object o) {        System.out.println("收到更新通知,进行更新");    }}
package com.observer.simple.in;public class Client {    public static void main(String[] args) {        ConCreteSubject s=new ConCreteSubject();        Observer o=new ConcreteObserver();        s.registerObserver(o);        s.setChanged(true);        s.notifyUpdate();       }}

这是一种简单的观察者模式,适用于观察目标与观察者是一对一关系的情景。该模式同样符合开闭原则,在实际项目中也有广泛应用。比如移动app中往往需要实现网络状态改变的监听,把主界面作为网络状态机制的观察者,一旦网络断开就通知主界面做相应的断网提示。但这里需要注意的是,网络状态机制的生命周期通常是整个应用的生命周期,所以如果退出主界面切换账号时要记得在主界面的onDestroy方法中调用removeObserver()方法把对主界面的引用置空,不然的话会出现主界面内存泄漏的情况。

当然观察者模式还有更简化的实现方式,比如我们经常遇到的回调函数,事件监听等都是应用观察者模式的思想。

0 0