定义:

定义对象之间一种一对多的关系,当被观察者状态变化时,可以自动地通知观察者并执行相关的业务操作。观察者模式又被称为发布-订阅模式等。

结构图:

  • Subject:抽象主题类,定义了所有被观察类的通用接口。一般内部持有一个观察者集合引用,用于维护完成自身的观察者们,并且定义了一系列方法来增加和删除观察者对象。当调用notify()方法来进行通知时,一般会遍历观察者集合来依次进行通知。
  • ConcreteSubject:具体主题类,被观察者对象。实现了抽象类关于观察者的所有接口和自身的业务方法。当自身的状态发生变化时,则向各个观察者发出通知。
  • Observer:观察者类,定义了所有观察者类被通知时被调用的通用接口。
  • ConcreteObserver:具体观察者,实现了抽象观察者中定义的事件处理接口。同时一般也维护一个subject对象,用于获得subject的状态信息或者将自己从观察者集合中 移除。

JDK中的观察者模式

在JDK总定义了Observable和Observer接口,用于实现观察者模式,其UML图如下:

  • JDK从1.0后便采用了DEM(DelegationEvent Model)模型,用于事件的处理。事件源对象、事件监听对象和事件对象组成了事件模型的三要素。

优点:

  • 观察者模式可以实现表示层和数据逻辑层的分离,典型的MVC模型就采用的观察者模式。View层观察Model层,当Model层数据变化时,对应的View自动变化。
  • 观察者模式只是在观察者和观察目标间建立了一个抽象的耦合,因此可以通过抽象接口对两个部分进行独立地扩展。
  • 观察者模式支持广播通信,观察目标可以一对多的通知观察者。

缺点:

  • 如果一个观察者目标被注册了很多观察者,则观察者的通知方法会很耗费系统性能。
  • 有可能在观察者和被观察者之间存在循环依赖,导致系统崩溃。

实例:

ObserverPattern.java

十一个行为模式之观察者模式(Observer Pattern)的更多相关文章

  1. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

  2. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  4. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  5. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

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

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  7. jQuery中的观察者模式(Observer Pattern)

    在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...

  8. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  9. 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event

    观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...

随机推荐

  1. Redis初级介绍

    1 什么是Redis Redis(REmote DIctionary Server,远程数据字典服务器)是开源的内存数据库,常用作缓存或者消息队列. Redis的特点: Redis存在于内存,使用硬盘 ...

  2. [Hadoop大数据]——Hive连接JOIN用例详解

    SQL里面通常都会用Join来连接两个表,做复杂的关联查询.比如用户表和订单表,能通过join得到某个用户购买的产品:或者某个产品被购买的人群.... Hive也支持这样的操作,而且由于Hive底层运 ...

  3. easyui-combobox实现省-市-区县级联菜单

    省:<input id="sheng" class="easyui-combobox" style="width:100px" dat ...

  4. 解密jQuery事件核心 - 模拟事件(四)

    前几章已经把最核心的实现都分解过了,这一章我们看看jQuery是如何实现事件模拟的 在Internet Explorer 8和更低,一些事件change 和 submit本身不冒泡,但jQuery修改 ...

  5. 深入理解this机制系列第三篇——箭头函数

    × 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将 ...

  6. Oracle_SQL函数-分组函数

    分组函数 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值 组函数类型:主要有6种 AVG - 平均 COUNT - 计数 MAX - 最大 MIN - 最小 SUM - 求和 STDD ...

  7. 确保 PHP 应用程序的安全

    开始之前在本教程中,您将学习如何在自己的 PHP Web 应用程序中添加安全性.本教程假设您至少有一年编写 PHP Web 应用程序的经验,所以这里不涉及 PHP 语言的基本知识(约定或语法).目标是 ...

  8. IDDD 实现领域驱动设计-SOA、REST 和六边形架构

    上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(State) 六边形架构 DDD ...

  9. php使用post方式获得文件扩展名

    <form action="" method="post"> <input type="file" value=" ...

  10. composer安装yii2问题总结

    今天周六,在家安装yii2的advanced版本, 过程有些坎坷, 不过最后总算安装好了. 总结一下, 主要遇到下面两个问题: 1, 下载速度慢, 主要原因是网络问题 下载yii2时, 模板(除了ve ...