`

观察者模式——Observer

 
阅读更多

观察者模式—— Observer

 

    本系列文章中, State 模式的第一种实现方法 (switch 实现 state 转化 ) 将旋转门类 Door 作为 Observable 的子类,就采用了 Observer 模式。配套还应该实现 Observer 接口来支持对 Door 实例的观察。

 

    记忆要点:

                    记住下面的UML class图.

 

一、 Observer 模式

    观察者模式又叫做发布 - 订阅 (publish/subscribe) 模式、模型 - 视图 (Model/View) 模式、源 - 监听器 (Source/Listener) 模式或从属者 (Dependents) 模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己

    一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作( Collaboration )。观察者模式是满足这一要求的各种设计方案中最重要的一种。

    类图如下:



 

 

二、代码实现(不使用 java.util.Observer java.util.Observable

调用方式:

 

public static void main(String[] args) {

       //1. 组装Observer模式

       Observer obs1=new ConcreteObserver("obs1");

       Observer obs2=new ConcreteObserver("obs2");

       Observer obs3=new ConcreteObserver("obs3");

       Subject subject=new Subject();

       subject.attach(obs1);

       subject.attach(obs2);

       subject.attach(obs3);

 

       //2. 当subject状态改变时,会自动通知所有的观察者。

       //  不用逐个去调用观察者的方法

       subject.setState("新状态");

 }
 

*****************************************************************

Subject:

 

import java.util.ArrayList;

 

public class Subject {

    //维护Subject状态/属性

    private String state;

 

    public void setState(String state) {

       this.state = state;

       notifyObservers();

    }

   

    //提供Observer机制

    private ArrayList<Observer> observers=new ArrayList<Observer>();  

    public void attach(Observer observer){

       observers.add(observer);

    }

    public void detach(Observer observer){

       observers.remove(observer);

    }

   

    public void notifyObservers(){

       for(int i=0;i<observers.size();i++){

           ((Observer)observers.get(i)).update(state);

       }

    }

}
 

 

Observer:

 

public interface Observer {

    /**

     * Observer在Subject状态变化时被调用的方法

     * @param message

     */

    public void update(String message);

}
 

 

ConcreteObsever:

 

public class ConcreteObserver implements Observer{

    private String name=null;

    public ConcreteObserver(String name){

       this.name=name;

    }

   

    /* Observer在Subject状态变化时被调用的方法

     * @see observer.Observer#update()

     */

    public void update(String message){

       System.out.println("Observer["+name+"] received message["+message+"]");

    }

}
 

 

 

三、优点 / 缺点

优点

    Observer 模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样的表示层(观察者)。

    1 )在被观察者和观察者之间建立了一个抽象的耦合。被观察者只知道观察者的一个集合,且只知道它们有一些公共的接口 ( update()) 。因此两种角色的耦合度不高。

    2 )支持广播通信。

 

缺点 :

    每个观察者对象(外观对象)必须继承抽象出来的接口类,这样就造成了不方便。比如,有一个别人写的外观对象,并没有继承该抽象类,或者接口不对,我们又希望不修改该类直接使用它:虽然可以采用 Adaptor 模式一定程度上解决问题,但设计繁琐,增加出错几率。

    1 )有很多直接或间接的观察者的话,通知所有的观察者很耗时。

    2 )当观察者之间有循环依赖的话,当心被观察者触发它们之间的循环调用,导致系统崩溃 !

    3 )如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的 ???

  • 大小: 12.6 KB
分享到:
评论
1 楼 lishaoqingmn 2012-03-01  
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是java版本的,另外补充一下C#的观察者模式,的设计方法。

C#是建立委托,使用事件来使用观察者模式设计程序的,在这个方面,C#语言可以将java的这个缺点弥补掉。

加油!! 

相关推荐

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    本文将深入探讨其中的一种——观察者模式(Observer Pattern)。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### ...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    本文将深入探讨其中的一种——观察者模式(Observer Pattern),它是行为设计模式的一种,主要用来封装行为的变化,实现对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    [行为模式]head first 设计模式之观察者模式(observer)

    《观察者模式——深入解析与应用》 观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种...

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

    在《设计模式实现——观察者模式》这篇博客中,作者可能详细解释了观察者模式的概念、结构以及其在实际编程中的应用。以下是对观察者模式的详细阐述: 1. **模式定义**:观察者模式是一种对象行为型模式,它允许...

    Observer模式

    源码分析方面,我们可以深入研究java.util.Observable和java.util.Observer的实现,了解如何通过这两个类实现观察者模式。同时,还可以探索其他编程语言中对观察者模式的支持,如C#的System.ComponentModel....

    Java设计模式——观察者模式

    首先,我们来看"Java设计模式——观察者模式的两种情况": 1. **主动通知**: 在这种情况下,被观察者对象在自身状态发生变化时,会主动调用`Observable`接口提供的`notifyObservers()`方法,将变化通知给所有注册的...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从中,我们就可以得出观察者模式的定义。  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    设计模式-观察者

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

    观察者模式使用

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于对象间的一对多依赖关系管理。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个...

    委托实现观察者模式

    C#语言提供了一种强大的工具——委托,来实现观察者模式。 委托在C#中类似于函数指针,它能够引用方法,并可以在运行时动态地调用这些方法。委托是类型安全的,可以用来传递方法作为参数,或者将方法存储在变量中。...

    浅谈观察者模式及在C#中的实现

    观察者模式(Observer Pattern)是一种行为设计模式,其主要目的是解决面向对象设计中常见的问题——如何实现对象间的解耦,使得一个对象的状态改变能够自动通知其他多个依赖对象,从而达到“高内聚、低耦合”的设计...

    Android监听——回调模式与观察者模式

    而在观察者模式中,Java的Observer和Observable接口提供了标准的观察者模式实现,但Android的BroadcastReceiver并不直接使用这两个接口,而是通过注册和接收Intent广播来实现观察者模式。 至于"压缩包子文件的文件...

    排列方块小游戏(观察者模式的简单应用)

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

    深入浅出设计模式二——WeatherData设计(观察者模式)实现二

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

    Android 设计模式学习之观察者模式应用实例

    本文将深入探讨一种常用的设计模式——观察者模式(Observer Pattern),并结合Android实际应用给出实例解析。 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...

    C++中的三大设计模式:单例模式、工厂模式与观察者模式的代码实现

    内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...

    观察者模式

    在Java中,观察者模式是通过`java.util.Observer`接口和`java.util.Observable`类来实现的。`Observer`接口定义了观察者的通用行为,它包含了一个`update`方法,用于接收被观察对象状态变化的通知。`Observable`类则...

    设计模式培训-observer.pdf

    ### 设计模式培训——观察者模式详解 #### 引言 设计模式是在软件工程领域内,为解决特定问题而提出的经过验证的解决方案。在众多设计模式中,观察者模式(Observer Pattern)是一种行为型设计模式,它允许一个...

Global site tag (gtag.js) - Google Analytics