【设计模式与Android】观察者模式——千里眼和顺风耳

什么是观察者模式设计模式

 

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

 

观察者模式的实现方式异步

 

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

 

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

 

首先定义观察者spa

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);
    }
}设计

 

而后被观察者是花果山server

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中消息的通知默认是顺序执行,在观察者过多或者某个观察者出现卡顿的状况下,会影响总体的执行效率。

相关文章
相关标签/搜索