《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式

来源:互联网 发布:js 获取特定属性值 编辑:程序博客网 时间:2024/05/27 02:29

观察者模式,当我刚看到这个模式的名字时首先想到的就是Rxjava,看来也是时候正儿八经的学学Rxjava了。观察者模式是一个使用率非常高的模式,它最常用的地方就是GUI系统(图形操作界面),观察者模式的一大作用就是解耦,将被观察者和观察者解耦,使它们之间的依赖性更小,甚至毫无依赖。对GUI系统来说,观察者模式的目的就是将UI层与具体的业务逻辑解耦。


第十二章 解决、解耦的钥匙——观察者模式

1.定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。


2.使用场景

1).关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”的。

2).事件多级触发场景。

3).跨系统的消息交换场景,如消息队列、事件总线的处理机制。


3.简单实现

如果我们订阅了一本杂志,例如《读者》,那么每次《读者》发布新刊的时候,我们都会收到通知,即新杂志。而且,并不是只有我们收到,所有订阅了《读者》的朋友都会收到。这就形成了一对多的关系,《读者》杂志就是被观察者,所有订阅它的人都是观察者。

定义一个订阅者类,实现Observer接口:

public class Subscriber implements Observer {    //简单定义一个属性,用来区分是不同的观察者    private String name;    public Subscriber(String name) {        this.name = name;    }    @Override    public void update(Observable observable, Object o) {        System.out.println(name + "收到了新一期的读者杂志");    }}


定义《读者》杂志类,继承Observable类,里面就一个简单的退出新刊的方法:

public class Reader extends Observable {    public void pushNewReader() {        //标识状态或内容发生改变        setChanged();        //通知所有观察者        notifyObservers();    }}

然后在MainActivity中调用:

        Subscriber mSubscriber1 = new Subscriber("张三");        Subscriber mSubscriber2 = new Subscriber("李四");        Subscriber mSubscriber3 = new Subscriber("王麻子");        Reader mReader = new Reader();        mReader.addObserver(mSubscriber1);        mReader.addObserver(mSubscriber2);        mReader.addObserver(mSubscriber3);        mReader.pushNewReader();


运行程序,可以看到如下结果:


可以看到三个订阅者都收到了新刊。

需要注意的是,重写的 update() 方法中有两个参数,一个 Observable ,指的当然就是被观察者,还有一个 Object 类型的参数,也就是说,被观察者还能传参数过来。 Observable 中的 notifyObservers() 方法有两个重载,一个是无参的 notifyObservers() ,还有一个可以传 Object 的 notifyObservers(Object o) 重载。

还有一点,我在运用观察者模式的时候发现执行 update() 方法的线程跟执行 notifyObservers() 方法的线程是同一个线程。


4.总结

其实感觉观察者模式就跟广播类似,一个地方发送广播,所有注册了该广播的广播接收者都能收到,书中还多次提到事件总线,这也是一个实现了事件订阅者和事件发布者解耦的框架,所以 EventBus 和 Rxjava 都会列入我的学习范围。

观察者模式的主要作用就是对象解耦,将观察者和被观察者完全隔离开来,只依赖于 Observable 和 Observer。

优点:

1).观察者和被观察者之间是抽象耦合,应对业务变化。

2).增强系统灵活性,可扩展性。

缺点:

1).观察者模式需要考虑一下开发效率和运行效率,程序中有一个被观察者和多个观察者,开发和调试都比较复杂,而且 Java 中的消息通知默认是顺序执行的,所以一个观察者卡顿,可能会影响程序整体的执行效率,在这种情况下,一般都考虑异步的方式。

Demo下载

阅读全文
0 0