理解设计模式(观察者)

  观察者模式,保证主题和若干观察者之间的一致性。

概述

有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式

此种模式通常被用来实现事件处理系统

特定环境

  • 一个对象改变,同时引发其他若干对象发生变化时
  • 主动改变的对象和被动变化的对象之间相对独立,以便复用和维护

一类问题

一个系统,由一个对象和若干协作对象组成,同时要避免这些对象之间相互耦合

解决方案

  • 抽象主题角色
  • 具体主题角色
  • 抽象观察者角色
  • 具体观察者角色

抽象主题角色

一般由接口或抽象类实现

注册有若干抽象观察者的引用集

同时,能够增删抽象观察者,并在自身发生改变时,通知观察者作出相应变化

具体主题角色

一般由具体子类实现抽象主题角色,具有自己的状态

抽象观察者角色

一般由接口或抽象类实现

为所有具体观察者定义行为规范

并定义方法,接收通知并更新自身状态

具体观察者角色

一般由具体子类实现抽象观察者角色,具有自己的状态,随主题状态变化而变化

推模型和拉模型

在观察者模式中,又分为:

  • 推模型
    主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。
  • 拉模型
    主题对象在通知观察者的时候,只传递少量信息
    如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据
    一般这种模型的实现中,会把主题对象自身通过 update 方法传递给观察者
    这样在观察者需要获取数据的时候,就可以通过这个引用来获取了

两种实现方式的比较

  • 推模型是假定主题对象知道观察者需要的数据;
    而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者,让观察者自己去按需要取值
  • 推模型可能会使得观察者对象难以复用,因为观察者的 update方法 是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update方法,或者是干脆重新实现观察者;
    而拉模型就不会造成这样的情况,因为拉模型下,update 方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要

Java 中的 Observer 接口 和 Observable 类

Observer 接口 :观察者

Observable 类 : 主题,即被观察者

通过继承或实现它们,可以快速实现观察者模式,并且线程安全

另外,这两个类型使用的是 拉模型

参考

《JAVA与模式》之观察者模式,作者: java_my_life

时间: 2024-12-21 18:33:23

理解设计模式(观察者)的相关文章

Asp.net设计模式笔记之一:理解设计模式

GOF设计模式著作中的23种设计模式可以分成三组:创建型(Creational),结构型(Structural),行为型(Behavioral).下面来做详细的剖析. 创建型 创建型模式处理对象构造和引用.他们将对象实例的实例化责任从客户代码中抽象出来,从而让代码保持松散耦合,将创建复杂对象的责任放在一个地方,这遵循了单一责任原则和分离关注点原则. 下面是“创建型”分组中的模式: 1.Abstract Factory(抽象工厂)模式:提供一个接口来创建一组相关的对象. 2.Factory Met

换种思路去理解设计模式(下)

开写之前,先把前两部分的链接贴上.要看此篇,不许按顺序看完前两部分,因为这本来就是一篇文章,只不过内容较多,分开写的. 换种思路去理解设计模式(上) 换种思路去理解设计模式(中) 8       对象行为与操作对象 8.1     过程描述 所谓对象行为和操作对象,需要三方面内容: l  操作过程: 一般表现为一个方法.该方法接收一个对象或者组合类型的参数,然后对这个对象或者组合进行操作,例如修改属性.状态或者结构等. l  操作的对象或组合: 会作为实参传入操作过程,会被操作过程修改属性.状态

PHP设计模式-观察者

PHP设计模式-观察者 一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式.一个对象通过添加一个attach方法允许观察者注册自己,使本身变得可观察.当被观察的对象更改时,它会将消息发送到已注册的观察者.观察者使用该信息执行的操作与被观察的对象无关.观察者模式是一种事件系统,意味着这一模式允许某些类通过观察被观察类的状态变化,做出相应的动作. 观察者模式UML图 php5中提供了观察者observer与被观察者subject接口 interface SplSubject

深入理解设计模式---系列目录

一.创建型模式 深入理解设计模式(一):单例模式(Singleton pattern): 确保一个类只有一个实例, 并提供全局访问点. 深入理解设计模式(二):简单工厂模式(factory method pattern): 实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 深入理解设计模式(四):工厂方法模式(factory method pattern): 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例

深入理解设计模式(终):总结--设计模式是药,没病就不要吃药

系列链接地址: 深入理解设计模式---系列目录 一.产品汪的神助攻,代码狗的安慰剂 定义:设计模式,指的是一个场景(context)下的一种解决方法(Solution),只要大家都认可某种模式,那么就只需要很短的一个名字,就可以代替很多很多的语言和文字交流,如果你觉得设计模式降低生产效率,那只能说你在这一行还要继续修炼. 宗旨:保证系统的低耦合高内聚,指导它们的原则无非就是封装变化,责任单一,面向接口编程等设计原则 目的:就是为了让代码变得更容易理解和维护 精髓:将复杂的逻辑抽离出来,让开发人员

深入理解设计模式六大原则

深入理解设计模式六大原则 万变不离其宗,不管是Java还是C++,凡是面向对象的编程语言,在设计上,尽管表现形式可能有所不同,但是其实质和所需遵守的原则都是一致的.本文便是带领读者去深入理解设计模式中的六大原则,以期帮助读者做出更好的设计. 单一职责原则 单一职责原则:Single Responsibility Principle,简称SRP 定义: 应该有且仅有一个原因引起类的变更. 问题场景: 类C负责两个不同的职责:职责D1,职责D2.当由于职责D1需求发生改变而需要修改类C时,有可能会导

我理解设计模式C++实现观察者模式Observer Pattern

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

如何通俗理解设计模式及其思想

术与道 数据结构,算法,设计模式被认为是程序员必备技能的三叉戟,如果说编程语言的语法特性和业务编码能力是[术],那么这三者可以称得上是[道]--[术]可以让你在IT行业赖以生存,而[道]则决定你未来在技术这条道路上可以走多远. 边学边忘的窘境 先自我介绍一下. 我是一个两年工作经验的Android开发人员,就像很多同行一样,对于数据结构,算法,设计模式这些被奉为程序员必修的三门内功,几乎没有去系统性地学习过(曾经专业课的数据结构,如今也基本还给了老师). 你问我想不想当一个称职的程序员,当然!数

理解设计模式(适配器)

适配器模式,转换不同接口,实现兼容. 特定环境 接口兼容—使用现有类,但使用方式与原有方式不同,需要转换—现有接口兼容第三方组件—保留并使用原系统类的功能,但客户端访问方式发生变化,同时无法修改原有代码时 相近功能类间的转换 一类问题 接口不兼容的类,不能协同合作 解决方案 3个角色: 目标接口 Target : 提供期待的使用方式,由类或接口实现 被适配者 Adaptee : 类原有使用方式,由类或接口实现 适配器 Adapter : 封装Adaptee引用,实现或继承Target,重写Tar