观察者模式

概念

定义对象间的一种一(Observable)对多(Observer)的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
举个例子,一个程序员在搞开发(被观察者),后面一群产品,测试,UI,运营(观察者们)在盯着,程序员一旦完成了开发,其他人就都知道了,并且开始完成后期任务。

观察者模式_第1张图片
程序员和观察者们.jpg

观察者模式,字面意思是被观察者做自己的事儿,观察者们就在旁边看,看着做完了就做出一定的反应,但是实际在程序中,我们不是这么用的,观察者如果时时刻刻都在盯着被观察者,多累呀,一般都是使用的发布-订阅模式,就是说程序员自己开发自己的功能,其他想要关心进度的人就提前告诉程序员一声,程序员把功能开发好了,再挨个通知,功能开发完了,其他订阅者(观察者)再做出响应,啊,程序员真是累呀!

献上简易demo

具体的代码实现上面需要两个接口,一个是被观察者接口,一个是观察者接口,这样便于扩展,解耦。

/**
 * 被观察者接口
 */
public interface Observable {
    //添加观察者
    void attach(Observer observer);
    //删除观察者
    void detach(Observer observer);
    //通知所有的观察者
    void notifyObservers();
}
/**
 * 观察者接口
 */
public interface Observer {
    //更新
    void update();
}
/**
 * 被观察者实现类(苦逼的程序员)
 */
public class Programmer implements Observable {
    private List observers = new ArrayList<>();
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void change(){
        Log.i("huan","程序员:功能终于开发完啦,哈哈哈哈");
        notifyObservers();
    }
    @Override
    public void notifyObservers() {
     for(Observer observer:observers){
         observer.update();
     }
    }
}
/**
 * 观察者实现类(产品经理)
 */
public class PMObserver implements Observer{
    @Override
    public void update() {
        Log.i("huan","产品:额,我这里想加个需求,哪里也要加个功能");
    }
}
/**
 * 观察者实现类(测试)
 */
public class QAObserver implements Observer {
    @Override
    public void update() {
        Log.i("huan","测试:你这个功能一定有bug,你看点这里没有反应。。。");
    }
}
/**
 * 观察者实现类(运营)
 */
public class OPObserver implements Observer {
    @Override
    public void update() {
        Log.i("huan","运营:我要去给用户瞎掰新功能了");
    }
}
       Programmer programmer = new Programmer();
        QAObserver qa = new QAObserver();
        PMObserver pm = new PMObserver();
        OPObserver op = new OPObserver();
        programmer.attach(qa);
        programmer.attach(pm);
        programmer.attach(op);
        programmer.change();

log输出

输出结果.png

代码非常简单

观察者模式的优缺点

优点:解耦,观察者双方都依赖于接口,双方的扩展和变化都不相互影响。
缺点:运行效率有影响,一般情况下java使用的是顺序执行,一旦一行代码死循环下面的代码就都无法执行,所以这里需要做异步处理。

Android中的观察者模式

使用的太多,这里就举一些简单的例子,所有控件的事件监听(OnClickListener)就是使用观察者模式实现的,广播(BroadcastReceiver)。

你可能感兴趣的:(观察者模式)