`
Tonyguxu
  • 浏览: 277790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

观察者设计模式

 
阅读更多

一。前言

面临的问题:在一个软件系统中,当某个对象的状态(或者执行某些操作)发生变化,某些其他的对象也做出相应的改变。


有什么解决方案呢?

解决方案一:

class objectA{

  operationA1(){

      do something ...

      //通知objectB、objectC做出相应改变

      objectB.operationB1;

      objectC.operationC1;

      objectN.operationN1;

  }

}

class objectB{

   operationB1

}

class objectC{

   operationC1

}概述

http://www.iteye.com/topic/102068/ 中作者对观察者模式讲解的比较通俗了(表演者和评委的例子),让我也知道了java.util包中有对观察者模式的支持(提供了被观察者类Observable和观察者接口Observer, Observable 类中给出了被观察者应具备的一切条件),还提到spring和hibernate也有对该模式的支持。

 

观察者模式的用途是什么?

 

http://www.ibm.com/developerworks/cn/java/j-aopwork6/ 写道
定义对象之间的一对多依赖关系,因此,当一个对象的状态发生改变时,其所有依赖项都会得到通知,并自动更新。

 

 

这使得观察者适用于所有类型的通知需要。请考虑以下情况:

 

 写道
1.条形图可以观察它显示的数据对象,以便在这些对象变化时对它们进行重新绘制。
2.AccountManager 对象能够观察 Account,这样,在帐户状态改变时,它们可以向销售人员发送一封电子邮件。
3.支付服务能够观察在线音乐商店中的歌曲播放事件,以便向客户收费。
 

 

注:通过看 "相关知识第2条"链接的文章,知道OO(面向对象)对设计模式有一套实现(言外之意就是像AOP也有一套实现了)。这篇学习笔记从OO角度来研究Observer Pattern。

 

回答以下几个问题:

 

http://www.ibm.com/developerworks/cn/java/j-aopwork6/ 写道
1. 哪个对象是主体,哪个对象是观察者?
2. 什么时候主体应当向它的观察者发送通知?
3. 当接收到通知时,观察者应该做什么?
4. 观察关系应当在什么时候开始,什么时候终止?
 

 

角色

抽象主题角色:

抽象观察者角色:

具体主题角色:

具体观察者角色:

 

类图、时序图


 注:Subject类持有Observer的多个引用,之间是依赖关系。

 

 

 

 

 读《重构与模式》
《重构与模式》p193-198 在原先硬编码设计基础上进行了重构,体会随着需求增多,基于“可扩展性”考虑做的设计,慢慢改进过程。
示例中类A负责收集信息(如测试通过还是失败),类B负责信息显示。
开始时,只有显示到图形用户界面的需求,针对这个需求只要类A持有类B的引用即可。后续增加需求,需要能够将信息同时显示到UI、网页、控制台上。

由于一开始的设计不具备“可扩展性”,随着功能增强,基于原先设计进行开发往往使代码冗余或者不能实现某种功能(同时通知显示在不同界面上)。

硬编码的设计-->Observer模式重构

对于这个示例重构有如下几步
step1.确保通知者和接收者责任明确,通知者只负责信息传递,接收者负责接收信息并做相应处理。——搬移函数重构
因为将信息输出到控制台比较简单,原先的编码是直接在通知者类中输出信息到控制台,“搬移函数”重构是将输出操作搬移到
接收者类中。
step2.提炼接口重构:提取观察者接口or监听器接口or接收者接口or订阅者接口。
该接口中包含哪些方法?需要知道被观察对象需要调用观察者对象里的哪些方法。
step3.。。。

示例


相关知识

1.委派事件模型:Delegation Event Model

2.熟悉了面向方面编程AOP,如果想深入学习 面向方面技术实现设计模式,可参见系列文章

 《用 AspectJ 增强设计模式》

a. http://www.ibm.com/developerworks/cn/java/j-aopwork5/

b. http://www.ibm.com/developerworks/cn/java/j-aopwork6/

 

 

 

 

 

 

  • 大小: 8 KB
分享到:
评论

相关推荐

    ObserverDemo观察者设计模式源码

    观察者设计模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在很多场景下都有广泛...

    委托和事件-观察者设计模式

    观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 **委托** 委托在.NET中可以视为类型安全的函数指针,它允许我们...

    观察者设计模式 C++实现

    观察者设计模式是一种行为设计模式,它允许一个对象(称为主题)在状态改变时通知其他对象(称为观察者)。这种模式常用于事件处理,当一个对象的状态发生变化时,所有依赖于该状态的对象都会得到通知并自动更新。在...

    观察者设计模式demo

    观察者设计模式是一种行为设计模式,它允许对象在状态改变时通知其他依赖它的对象,而无需显式指定这些依赖关系。在这个"观察者设计模式demo"中,我们可能看到一个具体的实现,特别是在Android开发中的应用,例如在...

    构建者模式、回调和观察者设计模式

    构建者模式、回调和观察者设计模式是软件开发中常用的设计模式,它们分别在不同的场景下发挥着重要的作用。下面将详细介绍这三个设计模式,并通过一个简单的例子来展示它们的应用。 首先,构建者模式(Builder ...

    java中监听机制,以及观察者设计模式

    Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...

    设计模式之观察者设计模式理解

    轻松理解观察者设计模式

    java观察者设计模式demo源码

    Java观察者设计模式(Observer Design Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理,例如...

    观察者设计模式笔记

    031114_【第11章:Java常用类库】_观察者设计模式笔记

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    观察者模式java实现观察者设计模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,我们可以利用Java提供的...

    ObserverDemo观察者设计模式Demo

    ObserverDemo观察者设计模式Demo

    跟我一起学 设计模式-观察者模式

    观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    观察者模式

    观察者设计模式观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时...

    设计模式之观察者模式

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

    Java观察者设计模式详解

    Java观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件处理系统,将观察者与被观察对象解耦,使得...

Global site tag (gtag.js) - Google Analytics