`

设计模式(19)-行为型-观察者模式(Observer)

 
阅读更多

概述

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  最容易让人联系到的就是GUI用户界面当中数据和视图的对应关系,当数据发生变化时,它对应的所有的视图都自动更新。

适用性

    1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。
      将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

    2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

    3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
			

参与者

    1.Subject(目标)
      目标知道它的观察者。可以有任意多个观察者观察同一个目标。
      提供注册和删除观察者对象的接口。

    2.Observer(观察者)
      为那些在目标发生改变时需获得通知的对象定义一个更新接口。

    3.ConcreteSubject(具体目标)
      将有关状态存入各ConcreteObserver对象。
      当它的状态发生改变时,向它的各个观察者发出通知。

    4.ConcreteObserver(具体观察者)
      维护一个指向ConcreteSubject对象的引用。
      存储有关状态,这些状态应与目标的状态保持一致。
      实现Observer的更新接口以使自身状态与目标的状态保持一致


类图


示例

package com.sql9.actioned;

import java.util.ArrayList;
import java.util.List;


/**
 * 观察者模式示例
 * @author iihero
 *
 */

abstract class Subject {
    private List<Observer> list = new ArrayList<Observer>();
    private String data = "Initial";
    public void setData(String data) {
        this.data = data;
    }
    public String getData() {
        return data;
    }
    public void attach(Observer o) {
        list.add(o);
        o.setSubject(this);
    }
    public void detach(Observer o) {
        list.remove(o);
        o.setSubject(null);
    }
    public abstract void setState(String state);
    public abstract String getState();
    public void doNotify() {
        for (Observer o: list) {
            o.update();
        }
    }
}

class ConcreteSubject extends Subject {
    String state;
    
    @Override
    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String getState() {
        return state;
    }
    
}

abstract class Observer {
    protected Subject s;
    public Subject getSubject() {
        return s;
    }
    public void setSubject(Subject s) {
        this.s = s;
    }
    public abstract void update();
}

class ConcreteObserver extends Observer {
    private String observerName;
    public ConcreteObserver(String name) {
        this.observerName = name;
    }
    @Override
    public void update() {
        System.out.println("In Observer " + this.observerName + " data from subject: " + this.s.getData());
    }

    
}



public class ObserverTest {

    public static void main(String[] args) {
        ConcreteSubject s = new ConcreteSubject();
        ConcreteObserver o1 = new ConcreteObserver("first observer");
        ConcreteObserver o2 = new ConcreteObserver("second observer");
        ConcreteObserver o3 = new ConcreteObserver("second observer");

        s.attach(o1);
        s.attach(o2);
        s.attach(o3);

        // make changes to subject
        s.setData("This is important subject data");

        // Notify all observers
        s.doNotify(); 
    }

}


结果

In Observer first observer data from subject: This is important subject data
In Observer second observer data from subject: This is important subject data
In Observer second observer data from subject: This is important subject data


分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    (行为型模式) Observer 观察者模式

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式

    设计模式--C++

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

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式 C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘...

    23种设计模式 (创建型,结构型,行为型)

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

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

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

    设计模式:可复用面向对象软件的基础--详细书签版

    5.7 observer(观察者)—对象行为型 模式 194 5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor...

    《设计模式》中文版(23个设计模式的介绍与运用)

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

    C#设计模式.PDF

    设计模式(19)-Observer Pattern 178 一、 观察者(Observer)模式 178 二、 观察者模式的结构 179 三、 观察者模式的示意性源代码 180 四、 C#中的Delegate与Event 183 五、 一个实际应用观察者模式的例子 187 六...

    设计模式(.PDF)

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

    GOLF设计模式(C++语言版)

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

    《国外写的,翻译版本》设计模式

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

    C#设计模式_设计模式_C#_

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

    软件设计师必读的书-设计模式

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

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

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

    设计模式文档

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

    设计模式 GOF 23

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

    C#设计模式大全

    设计模式(19)-Observer Pattern 一、 观察者(Observer)模式 二、 观察者模式的结构 三、 观察者模式的示意性源代码 四、 C#中的Delegate与Event 五、 一个实际应用观察者模式的例子 六、 观察者模式的优...

    研磨设计模式-part2

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

Global site tag (gtag.js) - Google Analytics