前言

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

正文

观察者模式

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

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

设计模式之观察者模式

主要角色

  1. 目标(Subject)

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

  2. 具体目标(ConcreteSubject)

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

  3. 观察者(Observer)

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

  4. 具体观察者(ConcreteObserver)

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

设计模式之观察者模式

demo

目标

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

  1. public interface Subject {
  2.   void addObserver(Observer observer);
  3.   void removeObserver(Observer observer);
  4.   void notifyObserver();
  5. }
复制
具体目标

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

  1. public class ConcreteSubject implements Subject {
  2.   //只是简单测试,不涉及多线程
  3.   private final List<Observer> list = new ArrayList<>();
  4.   @Override
  5.   public void addObserver(Observer observer) {
  6.       if (null != observer) {
  7.           list.add(observer);
  8.       }
  9.   }
  10.   @Override
  11.   public void removeObserver(Observer observer) {
  12.       if (null != observer) {
  13.           list.remove(observer);
  14.       }
  15.   }
  16.   @Override
  17.   public void notifyObserver() {
  18.       for( Observer observer: list){
  19.           observer.update();
  20.       }
  21.   }
  22. }
复制

观察者

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

  1. public interface Observer {
  2.     void update();
  3. }
复制
具体观察者

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

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

优缺点

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

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

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

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

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

课外知识

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

  1. ListView和Adapter监听数据变化

  2. 广播机制

  3. EventBus

  4. RxAndroid

参考文章

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

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

  3. 观察者模式

相关文章

暂无评论

none
暂无评论...