观察者模式

观察者模式中有主题(Subject)和观察者(Observer),分别对应报社和订阅用户(你).观察者模式定义了对象之间的一对多的依赖关系,这样,当"一"的一方状态发生变化时,它所依赖的"多"的一方都会收到通知并且自动更新.如图:


D3323DD0-D6DF-43CA-90C7-B0F82831EF36.png

Android开发中经常用到:

mBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      }
});

这段代码中 mBtn 是被观察者, OnClickListener 是观察者。 二者通过setOnClickListener() 方法达成订阅关系。setOnClickListener方法使得mBtn保存了调用onClick()方法的机会。至于mBtn怎么去调用onClick方法就看mBtn怎么去实现了,很明显当mBtn被点击的时候,就会去判断是否注册了onClick方法,如果有就调用。
总结起来就是:
(Button-> 被观察者( Observable)、OnClickListener ->观察者(Observer)、setOnClickListener() ->订阅(subscribe),onClick() -> 事件(event))
观察者模式抽象出来就是: Observable.subscribe(Observer)

介绍

观察者模式也被称为发布-订阅(Publish/Subscribe)模式,它属于行为型模式的一种。观察者模式定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听。当这个主题对象状态变化时,会通知所有观察者对象并作出相应处理逻辑。

UML

950DCBF6-1D6B-40A3-9430-E75586FDA68D.png

观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。

  1. 抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。
  2. 具体主题(ConcreteSubject):该角色继承或实现了抽象主题,定义了一个集合存入注册过的具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  3. 抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。
  4. 具体观察者(ConcrereObserver):该角色是具体的观察者对象,在得到具体主题更改通知时更新自身的状态。

实现代码

抽象观察者(Observer)接口
public interface Observer {
     public void update(String msg, TextView tv);
}
具体观察者(Person)类
public class Person implements Observer {
    // 用户名
    private String name;
    public Person(String name) {
        this.name = name;
    }
    @Override
    public void update(String msg, TextView tv) {
        tv.setText(tv.getText()+name+":"+ msg +"\n");
    }
}
抽象主题(Subject)或者说是 被观察者 (Observerable) 接口
public interface Subject {
    /**
     * 增加观察者
     * @param observer
     */
    public void attach(Observer observer);
    /**
     * 删除观察者
     * @param observer
     */
    public void detach(Observer observer);
    /**
     * 通知观察者
     */
    public void notify(String message, TextView v);
}
具体主题(XiaosongSubject)类
public class XiaosongSubject implements Subject {
    //用于保存订阅了小嵩的博客的用户
    private List<Observer> mPersonList = new ArrayList<>();
    @Override
    public void attach(Observer observer) {
        mPersonList.add(observer);
    }
    @Override
    public void detach(Observer observer) {
        mPersonList.remove(observer);
    }
    @Override
    public void notify(String message, TextView tv) {
        for (Observer observer : mPersonList) {
            observer.update(message,tv);
        }
    }
}
测试代码
E7AF9173-1647-443E-A94A-ABB2D21414CE.png

总结

在Android中,有很多场景使用了观察者模式,比如Android的源码里:OnClickListener、ContentObserver、android.database.Observable等;还有第三方开源库EventBus、RxJava、RxAndroid等。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 了解 RxJava 的应该都知道是一个基于事务驱动的库,响应式编程的典范。提到事务驱动和响应就不得不说说,设计模式...
    骑摩托马斯阅读 3,725评论 0 1
  • 用最简单的一句话来理解观察者模式就是:当一个对象发生改变时,其相关依赖对象皆得到通知并被自动更新。 关于这个图的四...
    芒果味的你呀阅读 5,430评论 0 9
  • 上一篇中我们了解了什么是RxJava,用一个词来总结就是异步。这里我们来讲讲RxJava的异步实现。它是通过一种扩...
    于阗阅读 6,481评论 0 2
  • 前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则一...
    四月葡萄阅读 30,691评论 7 63
  • 一、观察者模式的定义 定义对象间一对多的依赖关系,使得当前对象改变了状态,则所有依赖于它的对象都会得到通知并自动更...
    sssssss_阅读 3,635评论 0 0