首页 > 技术文章 > 观察者模式

not2 2019-06-11 16:30 原文

一、概述

一般问题:解决一个对象状态改变给其他对象通知的问题

核心方案:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

设计意图:依赖即耦合,观察者模式将依赖关系对象化,可以实现松耦合。

  • Observer是观察者,定义具体观察接口
  • Subject是被观察者,包含一个观察者列表

二、运用实例

观察者模式是一种很常用的设计模式,实现方式有很多种,比较常用的是“注册——通知——注销”的形式。以Systemui中解锁方式状态变化时通知解锁图标为例:

UnlockMethodCache直接维护解锁方式状态,是被观察者:

public class UnlockMethodCache {

  private final ArrayList<OnUnlockMethodChangedListener> mListeners = new ArrayList<>(); //观察者列表
      /*注册观察者*/
  public void addListener(OnUnlockMethodChangedListener listener) {
        mListeners.add(listener);
   }
      /*注销观察者*/
  public void removeListener(OnUnlockMethodChangedListener listener) {
        mListeners.remove(listener);
  }
      /*通知观察者*/
  private void notifyListeners() {
        for (OnUnlockMethodChangedListener listener : mListeners) {
            listener.onUnlockMethodStateChanged();
        }
  }
  private void update(boolean updateAlways) {
  ...
  notifyListeners();
  }
}

 

OnUnlockMethodChangedListener是观察者接口,定义具体通知方法:

    public static interface OnUnlockMethodChangedListener {
        void onUnlockMethodStateChanged();
    }

KeyguardBouncer是具体观察者类,实现通知方法:

public class KeyguardBouncer implements UnlockMethodCache.OnUnlockMethodChangedListener {
    @Override
    public void onUnlockMethodStateChanged() {
        mSimpleLockIcon.update();
    }
}

三、总结

总结:观察者模式是一种行为型设计模式,通过面向接口编程,以低耦合的方式实现两个类之间的回调。

优点:

  • 观察者和被观察者是抽象耦合(低耦合)的
  • 建立了一套触发机制

缺点:无法控制观察者行为,观察者太多时可能会造成通知阻塞

 

推荐阅读