什么是观察者模式

 

所谓观察者模式,就是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新的设计模式。

 

观察者模式的实现方式

 

观察者调用Observer接口,被观察者调用Observable接口。当被观察者有更新时,遍历所有观察者,这样就实现了一对多的通知功能。

 

《西游记》第一回孙悟空出世,马上便被千里眼和顺风耳报告给玉皇大帝,这就是一个典型的观察者模式。

 

首先定义观察者

public class Spy implements Observer {

    private String name;

    public Spy(String name){
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Log.e(name+"发现","花果山"+arg);
    }
}

 

然后被观察者是花果山

public class HuaguoMountain extends Observable {

    /**
     * 孙悟空登场
     * @param msg
     */
    public void SunWukongEnter(String msg){
        setChanged();
        notifyObservers(msg);
    }

}

 

被观察者发生变化

HuaguoMountain mountain = new HuaguoMountain();
mountain.addObserver(new Spy("千里眼"));
mountain.addObserver(new Spy("顺风耳"));
mountain.SunWukongEnter("山上有一仙石,石产一卵,见风化一石猴,在那里拜四方,眼运金光,射冲斗府。");

 

Android源码中的观察者模式

 

(1)notifyDataSetChanged

无论ListView还是RecyclerView里,notifyDataSetChanged方法都是至关重要的,这是最常见的观察者模式。

 

2)BroadcastReceiver

BroadcastReceiver是Android四大组件之一,也是一个典型的观察者模式。

 

3)EventBus

EventBus 是一个组件间通信框架,开发者在Activity、Fragment、Service、Thread之间传递消息时可以避免使用复杂的Intent、Handler和BroadCast

 

4)RxJava

RxJava作为同样基于观察者模式的组件间通信框架,要比EventBus的应用更广泛。尤其它针对Android的扩展——RxAndroid完全可以替代AsycTask来完成各种异步操作,而且还有BindActivity和BindFragment方法来避免异步操作时的Activity和Fragment的生命周期问题。

 

Android开发中如何利用观察者模式

 

(1)在观察者模式中,观察者和被观察者之间是抽象耦合,保证了订阅系统的灵活性和可扩展性。在需要UI层与业务逻辑解耦的关联行为场景或事件多级触发场景非常实用。

 

2)跨进程或者跨App的消息交换场景。

 

需要注意的几个问题

 

1)因为Java中消息的通知默认是顺序执行,在观察者过多或者某个观察者出现卡顿的情况下,会影响整体的执行效率。