zoukankan      html  css  js  c++  java
  • 观察者模式

    一、概述

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

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

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

    • 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();
        }
    }

    三、总结

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

    优点:

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

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

  • 相关阅读:
    ADT上跑java application
    GIT 用RSA加密方式来记住密码
    android中listView下有Button按钮始终在最底部
    Android学习:导入工程时报错The import android cannot be resolved
    Preference的使用
    MySQL查询时,查询结果如何按照where in数组排序
    MySQL创建民族表的SQL语句
    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
    使用file_get_contents()和curl()抓取网络资源的效率对比
    常用正则表达式整理(持续更新中)
  • 原文地址:https://www.cnblogs.com/not2/p/11004400.html
Copyright © 2011-2022 走看看