文档章节

观察者模式

noob_fly
 noob_fly
发布于 09/26 20:59
字数 760
阅读 2
收藏 0

意图:

在对象的内部状态发生变化时,自动通知外部对象进行响应。

构成

 被观察者:内部状态有可能被改变,而且又需要通知外部的对象。
 观察者:需要对内部状态的改变做出响应的对象。

Java实现

 Java的API中提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。

Observable 

public class Observable {
    private boolean changed = false;
    private Vector obs;


    public Observable() {
        obs = new Vector();
    }

   
    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

...


 setChanged():设置内部状态为已改变。

notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息

 protected synchronized void setChanged() {
        changed = true;
  }
 
 public void notifyObservers(Object arg) {
       
        Object[] arrLocal;

        synchronized (this) {
          
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }

Observer   

 update(Object obj):响应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。

public interface Observer {

    void update(Observable o, Object arg);
}

使用

  1. 创建一个被观察者,继承java.util.Observable
  2. 创建一个观察者,实现java.util.Observer接口
  3. 注册观察者,调用addObserver(Observer observer)
  4. 在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者
  5. 在观察者的update(Object)方法中,对改变做出响应。

好处

  • 被观察者只需要知道谁在观察它,无需知道具体的观察细节;
  • 被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码
  • 当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件
  • 多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用
  • 观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等

场景

屏蔽线程间的通信机制:eg. 两个线程之间,主线程可以作为观察者,执行线程是被观察者,彼此之间只知道对方存在,但不知道通信的细节;
消除硬编码:如果没有Observer模式,则只能采用回调的方式,或者在代码中显示地调用观察者;
优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量;
 

© 著作权归作者所有

共有 人打赏支持
noob_fly
粉丝 4
博文 64
码字总数 69887
作品 0
广州
程序员
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
32分钟前
1
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
48分钟前
4
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
3
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
1
0
mixin混入

①新建mixin.js文件 const mixin = { methods: { /** * 分页公共方法 */ handleSizeChange(val) { this.pageData.size = val; this.query(); }, hand......

不负好时光
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部