`

观察者模式——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的这个缺点弥补掉。

加油!! 

相关推荐

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

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

    设计模式代码——c#

    16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. ...

    design-pattern-java.pdf

    撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...

    设计模式--可复用面向对象软件的基础

    5.7 OBSERVER(观察者)——对象行为型模式 5.8 STATE(状态)——对象行为型模式 5.9 STRATEGY(策略)——对象行为型模式 5.10 TEMPLATE METHOD(模板方法)——类行为型模式 5.11 VISITOR(访问者)——对象行为...

    设计模式可复用面向对象软件的基础.zip

    5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    设计模式精解-掌握设计模式

    本书从一个新的视角描述面向对象设计,将...\r\n 如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。\r\n 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    深入浅出设计模式(中文版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    深入浅出设计模式(中文版电子版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    设计模式精解 译者:熊节 程序员必看书籍之一 part1

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷7

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷4

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

Global site tag (gtag.js) - Google Analytics