`
scanfprintf123
  • 浏览: 80243 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Observer模式不得不说的二三事

阅读更多

   今天有同事问我关于Observer模式的一个问题,说观察者(Observer)为什么要依赖于主题(Subject),如下图所示:



 

 

    从上图可以看出,具体的观察者对具体的主题有一个依赖, 而且从JDK本身提供的Observer接口,我们也可以看到,确实对主题(在JDK的实现中,为Observable接口)有一个依赖,如代码所示:

 

public interface Observer {
    void update(Observable o, Object arg);
}

  

 

   这个是为什么呢,为什么这里会依赖主题对象?其实这个跟Subject与Observer之间通讯的方式有关,当Subject本身状态发生变化时,会去通知注册了的Observer(即调用每个observer的update()方法),那么这个时候,主题本身要怎么样去给Observer传输其需要的数据呢?

  

   在我们看到的大多数观察者的实现中,主题(Subject)在通知注册的Observer时,都会把Observer所需要的数据封装好,传给Observer,这个也就是所谓的‘推’的模式,主题主动将数据推给观察者,这种情况下,Observer的接口往往定义如下:

      

public interface Observer {
    void update(Object arg);//从主题传入的数据
}

 

   在这种‘推’的模式下,观察者本身是不依赖于主题对象的。 但还有另外一种所谓‘拉’的通讯方式,是指观察者在需要数据的时候主动从主题对象中获取,这个情况下面就会出现观察者依赖于主题对象,

   

public interface Observer {
    void update(Subject subject); 
}

 

    由于这种拉的实现方法出现的比较少,而且‘拉’数据的模式有一个比较大的缺点,那就是出现了主题对象和观察者对象之间的循环依赖,处理不好则很容易出来死循环。

   

     但是对于一个完整的观察者模式来说,这两种数据传输的方式都是需要的,这也就是JDK的Observer接口中的update()方法要有两个参数的原因(Obervable对象一般对应于拉模式,Object对象一般对应于推模式),如果你做过Swing编程,你会发现在Swing的事件处理中,listner(实际上就是Observer)所接受的参数也支持推拉两种数据方式,如

     

public interface MouseListener extends EventListener {
    public void mouseClicked(MouseEvent e);

    。。。其他略
}

    这里的MouseEvent对象实际上也包含了数据来源对象(触发事件的对象),即具体主题对象,而除了主题对象之外的其他属性,我们都可以看成是推模式中所传的数据。

 

     好了,解决了同事了疑问,还需要点明Observer模式的另一职责。由于我们大多数的Observer模式的实现都很简单,在这样的实现下,主题对象大多只拥有一个职责,那就是管理Observer的职责(包括通知Observer),

    

class ConcreteSubject implement ISubject
{
    private List observers=..
    public void addObserver(Observer obs)
    {
         //add observer
    }
    
    public void removeObserver(Observer obs)
    {
         //remove observer
    }

    public void notifyObservers(Object obj)
    {
        //notify observers
    }

}

 

    加上Observer模式是为了解决一对多的关系,久而久之,导致大多数人都忘记了主题对象(Subject)本身还应该有另一个职责,管理Observer只是主题(Subject)对象应有的共同的职责,不要忘了,还有多主题对象这么一回事。举个以前看到的例子,

    假设我们的主题对象需要从远程获取一些数据,并分别的将其记录在DB中,和显示在Screen上,那么套用Observer模式,可以表示为:

    

 

   其中,DBObserver将拿到的数据写到DB中,而DisplayObserver将拿到的数据显示在SCREEN上,而MessagesSubject则有了两个职责,一个是我们前面说的管理Observer的职责,另一个是去远程取数据的职责,而这个我认为才是主题对象(Subject)应该有的具体的职责。

  

public class MessagesSubject extends AbstractSubject implements Runnable
{

//管理Observer的职责会从AbstractSuject中获得

//真正的业务逻辑
public void run()
{
    //从远程获得messages
    //通知观察者
}

 

    完成一个完整的Observer模式很难,考虑的东西比较多(光是通知Observer这部分就有几种不同的实现方式),不推荐每次都需要实现一个很完整的Observer模式,但是我们不应该遗忘这些构成完整Observer模式锁需要的部分。

 

 

 

  • 大小: 15.5 KB
  • 大小: 3.9 KB
0
0
分享到:
评论

相关推荐

    Observer设计模式实例

    文件名"ObserverTest"可能表示这是一个关于Observer设计模式的测试代码。在实际编程中,这样的测试文件通常会包含创建Subject对象,注册Observer,改变Subject状态并观察Observer是否正确响应的代码。通过测试,我们...

    Observer模式

    总的来说,Observer模式是构建可扩展、可维护软件的重要工具,它允许我们以灵活的方式处理对象之间的交互,提高代码的复用性和可测试性。无论是在设计大型系统还是解决日常编程问题时,理解并熟练运用Observer模式都...

    OBserver模式设计实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...

    Observer模式代码实现

    ### Observer模式代码实现 #### 观察者模式简介 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...

    observer模式实现示例

    Observer模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C++编程中,Observer模式通常通过函数指针或者接口来实现,这两种方法...

    Observer与Command模式在VTK类库设计中的应用研究

    #### 二、Observer/Command设计模式概述 ##### 1. Observer模式 Observer模式是一种行为设计模式,用于定义对象间的依赖关系,以便当一个对象(目标)的状态发生变化时,所有依赖于它的对象(观察者)都会自动收到...

    设计模式之观察者模式(Observer Pattern)

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    重温Observer模式--热水器·改

    在这个“重温Observer模式--热水器·改”的讨论中,作者将再次阐述如何不依赖C#的委托和事件来实现Observer模式,而是采用GOF(GoF,Gang of Four)的经典方式。 在Observer模式中,有两个核心角色:Subject(主题...

    Observer模式的应用

    请选用适当的设计模式,编写一个股票行情分析软件,随着时间的推移和股票价格的变动,实现各种指标的动态更新(要求至少实现一个股票的分时图和K线图:为降低编程工作量,K线图可以用开盘价、收盘价、最高价、最低价...

    C++ Observer模式

    Observer模式,也称为...总的来说,C++中的Observer模式是一种强大的设计工具,它允许我们创建反应性系统,使得对象间的通信更加灵活高效。通过理解和应用Observer模式,开发者可以更好地构建可扩展和可维护的软件。

    观察者模式,Observer

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

    设计模式C++学习之观察者模式(Observer)

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

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    Observer模式的传统实现和AOP实现

    对Observer模式的实现,引入后可直接使用。 包括传统实现和遵循AOP思想的实现

    Observer 模式

    Observer模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象,使得它们能够自动更新自己。这个模式在软件工程中扮演着重要的角色,尤其是在事件驱动或数据绑定的系统中...

    设计模式之Observer

    《设计模式之Observer》 设计模式是软件工程中的一种最佳实践,它们是在特定场景下解决常见问题的经验总结。Observer模式,又称为“观察者模式”或“发布-订阅模式”,是一种行为设计模式,用于在对象之间建立一种...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 单最常用的设计模式入门,比如AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式等

    设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...

    设计模式之略见一斑(Observer观察者模式)

    本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...

    Observer观察者模式

    Observer观察者模式是一种设计模式,属于行为模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有...同时,可以通过博文链接(已提供)来获取更多关于Observer模式的理论知识和实践指导。

Global site tag (gtag.js) - Google Analytics