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

使用观察者模式监听Map值的改变

阅读更多

 

观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。

 

具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。如本示例中的 ProcessObserver 和 TaskbarObserver

 

被观察者(Observable)角色:内部状态被改变时通知观察者对象

 

1. 被观察者

 

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

/**
 * @ClassName: MainObserver
 * @Description: 被观察者
 * @author 
 * @company 
 * @date 2013-5-2
 * @version V1.0
 */

public class MainObservable extends Observable {

    private static final MainObservable instance = new MainObservable();

    protected Map<String, Object> obs = new HashMap<String, Object>();

    private MainObservable() {}

    public static MainObservable getInstance() {
        return instance;
    }

    /**
     * @Title: doBusiness
     * @Description: 当被观察者有Changed时,通知观察者
     * @param arg
     * @author 
     * @date 2013-5-2
     */
    public void doBusiness(Object arg) {
        // 设置修改状态
        super.setChanged();
        // 通知观察者
        this.notifyObservers(arg);
    }

    /**
     * @Title: notifyObservers
     * @Description: 模仿不同的业务通知对应业务的观察者
     * @param arg
     * @see java.util.Observable#notifyObservers(java.lang.Object)
     * @author 
     */
    public void notifyObservers(Object arg) {

        String msg = arg.toString();

        String[] msgs = msg.split(":");

        if (obs.containsKey(msgs[0])) {
            Observer ob = (Observer) obs.get(msgs[0]);
            ob.update(this, msgs[1]);
        }
    }

    /**
     * @Title: addObserver
     * @Description: 添加一个观察者
     * @param name 观察者名称
     * @param o 观察者对象
     * @author 
     * @date 2013-5-2
     */
    public synchronized void addObserver(String name, Observer o) {

        System.out.println("添加一个观察者:" + name);

        obs.put(name, o);
    }

    /**
     * @Title: updateObserver
     * @Description: 修改一个观察者
     * @param name 观察者名称
     * @param o:观察者对象
     * @author 
     * @date 2013-5-2
     */
    public synchronized void updateObserver(String name, Observer o) {

        Iterator<String> it = obs.keySet().iterator();

        String key = null;

        while (it.hasNext()) {

            key = it.next();

            if (key.equals(name)) {
                System.out.println("被修改的key为:" + key);
                obs.put(key, o);
                break;
            }
        }
    }

    /**
     * @Title: deleteObserver
     * @Description: 删除观察者
     * @param o: 观察者对象
     * @see java.util.Observable#deleteObserver(java.util.Observer)
     * @author 
     */
    public synchronized void deleteObserver(Observer o) {

        if (obs.values().contains(o)) {

            Iterator<String> it = obs.keySet().iterator();

            String key = null;

            while (it.hasNext()) {

                key = it.next();

                if (obs.get(key).equals(o)) {
                    System.out.println("被删除的key为:" + key);
                    obs.remove(key);
                    break;
                }
            }
        }
    }
}

 

2. 具体观察者对象

    2.1     

 

import java.util.Observable;
import java.util.Observer;

/**
 * @ClassName: ProcessObserver
 * @Description: 观察者
 * @author 
 * @company 
 * @date 2013-5-2
 * @version V1.0
 */

public class ProcessObserver implements Observer {

    /**
     * @Title: update
     * @Description:实现观察者接口,当发现被观察者有Changed时执行该方法
     * @param o 观察者对象
     * @param arg:
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     * @author 
     */
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("update:" + arg);
    }

}

 

   2.2      

 

import java.util.Observable;
import java.util.Observer;

/**
 * @ClassName: TaskbarObserver
 * @Description: 观察者
 * @author 
 * @company 
 * @date 2013-5-2
 * @version V1.0
 */

public class TaskbarObserver implements Observer {

    /**
     * @Title: update
     * @Description: 实现观察者接口,当发现被观察者有Changed时执行该方法
     * @param o
     * @param arg:
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     * @author 
     */
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(arg);
    }

}

 

3. 测试类

 

public class Test {

    /**
     * @Title: main
     * @Description: TODO
     * @param args:
     * @author 
     * @date 2013-5-2
     */
    public static void main(String[] args) {

        // 实例化一个被观察者
        MainObservable ob = MainObservable.getInstance();

        // 实例化观察者
        ProcessObserver pro = new ProcessObserver();
        TaskbarObserver task = new TaskbarObserver();

        // 添加观察者
        ob.addObserver("proc", pro);
        ob.addObserver("task", task);

        System.out.println("添加后,Map=" + ob.obs);

        // 处理业务,当关闭一个eclipse时,通知两个观察者同时也移除该任务
        System.out.println("发送一条进程信息...");
        ob.doBusiness("proc:进程启动");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("发送一条任务信息...");
        ob.doBusiness("task:我给任务器推送消息了");

        // 移除一个观察者
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        ob.doBusiness("task:删除.");
        ob.deleteObserver(pro);
        System.out.println("删除后,Map=" + ob.obs);
        System.out.println("发送一条进程信息...");

        ob.doBusiness("task:重新添加.");
        
        task = new TaskbarObserver();

        ob.addObserver("task111", task);

        System.out.println("再次添加后,Map=" + ob.obs);

        ob.doBusiness("task:修改.");
        
        // 修改
        TaskbarObserver task1 = new TaskbarObserver();
        ob.updateObserver("task111", task1);

        System.out.println("修改后,Map=" + ob.obs);
       
    }
}

 

4. 测试结果

添加一个观察者:proc
添加一个观察者:task
添加后,Map={task=designpatterns.observer.exam01.TaskbarObserver@1ce2dd4, proc=designpatterns.observer.exam01.ProcessObserver@122cdb6}
发送一条进程信息...
update:进程启动
发送一条任务信息...
我给任务器推送消息了
删除.
被删除的key为:proc
删除后,Map={task=designpatterns.observer.exam01.TaskbarObserver@1ce2dd4}
发送一条进程信息...
重新添加.
添加一个观察者:task111
再次添加后,Map={task=designpatterns.observer.exam01.TaskbarObserver@1ce2dd4, task111=designpatterns.observer.exam01.TaskbarObserver@1a52fdf}
修改.
被修改的key为:task111
修改后,Map={task=designpatterns.observer.exam01.TaskbarObserver@1ce2dd4, task111=designpatterns.observer.exam01.TaskbarObserver@dc57db}

 

 

分享到:
评论

相关推荐

    使用MFC实现观察者模式(Observer)同时兼顾多窗口之间传值

    在实际应用中,`TestNotify`可能是一个测试程序,用于演示如何在MFC中使用观察者模式进行事件监听和多窗口之间的值传递。这个程序可能包含了创建观察者和被观察者对象,添加观察者到被观察者列表,以及在消息触发时...

    Android观察者模式设计思想

    5. **RxBinding**: RxBinding库将Android事件转换为RxJava的Observable流,这样开发者可以使用RX的特性(如map、filter、merge等)来处理事件,同样基于观察者模式,但提供了更强大的异步编程能力。 6. **...

    javascript观察者模式实现自动刷新效果.docx

    - `set`方法会在属性值改变时触发,如果该属性已经被观察,则会遍历所有的观察者并调用它们。 - `get`方法会在读取属性值时触发,如果当前函数是通过另一个函数调用的,则将该函数添加到观察者集合中。 ##### 3.2 ...

    JavaScript设计模式之观察者模式(发布者-订阅者模式)

    观察者模式,也被称为发布者-订阅者模式,是一种软件设计模式,它的核心思想是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于各种...

    23种设计模式的java实现

    20. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Java的`java.util.Observable`和`Observer`接口就是观察者模式的实现。 21. 状态模式...

    tarefa-prog-funcional-observer:观察者标准功能编程任务存储库

    在IT行业中,观察者模式(Observer Pattern)是一种广泛使用的软件设计模式,它属于行为设计模式。这个模式的主要目的是定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    livedata数据共享

    它可以作为一个中间人,监听多个LiveData源,并根据需要组合或处理它们的值,然后再发送给观察者。 6. **Transformations**:Transformations类提供了一些静态方法,如`map()`和`switchMap()`,它们可以用来转换...

    rxjs中文手册

    RxJS的核心在于Observable类型,其设计灵感来源于Reactive Extensions,它将观察者模式、迭代器模式以及函数式编程中使用集合的模式结合起来,旨在满足更高效管理事件序列的需求。 Observable(可观察对象)是RxJS...

    can-map:可观察的键值绑定

    当你改变这些属性的值时,`can-map`会自动处理更新: ```javascript myObservableObject.set("age", 31); ``` 这段代码会触发一个事件,通知所有监听`age`属性的订阅者,使得相关的视图或者逻辑能够得到更新。 在...

    扩展性设计,Observer,Events

    集合框架中的`List`、`Set`和`Map`接口提供了观察者模式的支持,例如`ObservableList`可以监听元素的添加、删除等变化。 “Event.JPG”可能展示了一个事件处理的流程图,事件通常包含事件源(Event Source)、事件...

    基于JAVA框架设计模式的学生交互系统设计-2019年教育文档.docx

    - 观察者模式:常用于事件驱动编程,例如GUI组件中的监听器。当特定事件发生时,观察者会被通知并执行相应的操作,如按钮点击或键盘输入。 2. Struts2中的设计模式: - 拦截器设计模式:Struts2使用责任链模式,...

    Rxjs_01.docx

    RxJS 是一个强大的响应式编程库,它使用观察者模式处理异步操作和事件,将时间因素纳入到编程思维中,让开发者可以更好地管理和组合基于时间的事件流。在这个文档中,我们将深入探讨 RxJS 的核心概念——可观察对象...

    RxJava_For_Android

    1. 观察者模式:RxJava基于观察者模式,通过Observer(观察者)和Observable(可观察者)两个核心接口实现数据流的订阅和发布。观察者订阅可观察者,当可观察者有新数据时,会通知观察者。 2. 流式编程:RxJava允许...

    rxjs中文文档.pdf

    RxJS可以被看作是针对事件的Lodash,它结合了观察者模式、迭代器模式和使用集合的函数式编程,以满足管理事件序列的需求。 Observable是一种可观察对象,它表示一个可调用的未来值或者事件的集合。你可以通过RxJS来...

    Reactive for Javascirpt介绍

    Subject是特殊类型的Observable,它允许多个观察者监听同一个Observable序列。Subject可以像传统的事件监听器那样被多处引用,并且可以将值或事件广播给所有的观察者。Subject是事件驱动模型的核心,在某些场景下,...

    高清彩版 Learning RxJava

    RxJava 基于观察者模式,这种设计模式允许对象注册自己作为观察者来监听其他对象的状态变化。在 RxJava 中,观察者通过订阅来接收数据或事件通知。 ##### 2. 可观察者(Observable) 可观察者是 RxJava 中的数据源...

    Rxjava功能操作符的使用方法详解

    被观察者通过订阅者订阅观察者,从而实现观察者监听被观察者返回的数据。 二、Rxjava的操作符 Rxjava提供了多种操作符来处理异步数据,例如: * map:将源数据转换为目标数据 * flatMap:将源数据转换为目标数据...

    swift-用于响应式编程的一个Swift框架

    响应式编程框架通常通过观察者模式、发布-订阅模式或者函数式反应式编程(FRP)的概念来工作。它们帮助开发者更轻松地处理用户界面和数据源之间的交互,使代码更简洁、更易于理解。 CwlSignal-master这个文件名可能...

    Android基于retrofit+rxjava+knife的mvp模式demo

    1. **Observables**:RxJava中的Observables是观察者模式的实现,可以订阅和发布事件。在网络请求中,Observables用于发送网络请求并接收响应数据。 2. **Operators**:RxJava提供了一系列操作符,如map、filter、...

Global site tag (gtag.js) - Google Analytics