前言

观察者模式是一种最最为常见的设计模式,代码中基本会要用到这个。记录一下相关知识,方便自己回顾和查阅。

正文

观察者模式

观察者模式(Observer Pattern): 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

观察者模式是一种对象行为型模式

设计模式之观察者模式

主要角色

  1. 目标(Subject)

    被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法

  2. 具体目标(ConcreteSubject)

    继承目标(Subject),实现具体业务逻辑。

  3. 观察者(Observer)

    抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。

  4. 具体观察者(ConcreteObserver)

    继承自抽象观察者,实现具体业务逻辑。

设计模式之观察者模式

demo

目标

被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法

public interface Subject {    void addObserver(Observer observer);    void removeObserver(Observer observer);    void notifyObserver(); }
具体目标

继承目标(Subject),实现具体业务逻辑。

public class ConcreteSubject implements Subject {    //只是简单测试,不涉及多线程    private final List<Observer> list = new ArrayList<>();      @Override    public void addObserver(Observer observer) {        if (null != observer) {            list.add(observer);        }    }     @Override    public void removeObserver(Observer observer) {        if (null != observer) {            list.remove(observer);        }    }     @Override    public void notifyObserver() {        for( Observer observer: list){            observer.update();        }    } }

观察者

抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。

public interface Observer {      void update(); }
具体观察者

继承自抽象观察者,实现具体业务逻辑。

public class ConcreteObserver1 implements Observer{    @Override    public void update() {        //收到更新通知,do something    } }
public class ConcreteObserver2 implements Observer{    @Override    public void update() {        //收到更新通知,do something    } }
客户端
ConcreteObserver1 concreteObserver1 = new ConcreteObserver1(); ConcreteObserver2 concreteObserver2 = new ConcreteObserver2(); ConcreteSubject concreteSubject = new ConcreteSubject();  concreteSubject.addObserver(concreteObserver1); concreteSubject.addObserver(concreteObserver2); //有更新,通知观察着 concreteSubject.notifyObserver();

优缺点

优点
  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系

  2. 目标与观察者之间建立了一套触发机制

  3. 符合“开闭原则”的要求

缺点
  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用

  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率

课外知识

观察者模式在Android也是很常见的

  1. ListView和Adapter监听数据变化

  2. 广播机制

  3. EventBus

  4. RxAndroid

参考文章

  1. 观察者模式,这一篇就搞定

  2. 设计模式-观察者模式(Observer)

  3. 观察者模式

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...