`
xurichusheng
  • 浏览: 335573 次
  • 性别: 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}

 

 

分享到:
评论

相关推荐

    java中监听机制,以及观察者设计模式

    详细讲解了java中的监听机制以及观察者设计模式

    设计模式-观察者模式 基于MFC实现的消息监听机制

    基于MFC实现的消息监听机制,利用了设计模式中的观察者模式,对线程间的同步做了优化,以及可以选择消息的发送类型:同步或异步发送。对于监听者而言在注册监听的同时可以选择监听的消息类型,避免了发送者发送的...

    javascript观察者模式Watch.JS.zip

    以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,监听对象的变化。用麻雀虽小五脏俱全来描述Watch.js比较合适。...

    Android,设计模式,观察者模式

    观察者模式定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。这里演示了通过改变一个数值来改变多个视图组件的显示。现在本人也处于学习阶段,不足之处,敬...

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

    在观察者模式下使用MFC实现的消息监听,可以选择同步或者异步传递消息。监听者可以选择监听的消息类型以及发送者,发送者无需关心监听者是谁。

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

    观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。

    观察者模式本质实例DEMO

    针对所有涉及的,监听者模式,观察者模式,订阅者模式的举例介绍,让大家更清晰的理解这几种模式的本质

    内容观察者模式运用

    在实现一些复杂的事件监听的时候,项目里会用到内容观察者模式,自定义内容观察者

    Java设计模式之监听器模式实例详解

    主要介绍了Java设计模式之监听器模式,结合实例形式较为详细的分析了java设计模式中监听器模式的概念、原理及相关实现与使用技巧,需要的朋友可以参考下

    Android使用观察者模式Observer实现网络状态监听

    主要为大家详细介绍了Android使用观察者模式Observer实现网络状态监听,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    观察者模式高级应用

    附件是个观察者模式高级应用地demo,实现了事件分发机制,例如当创建一个新用户后,发送创建用户地事件,事件总线里面有对创建用户地事件监听地监听器就会得到相应地执行,比较适合那种当一个对象改变状态,依赖它的...

    观察者模式实例图解,相信可以帮助大家理解

    这是我在学习工程中自己对这个模式的理解,大家可以看看

    java监听数据库

    java技术对数据库语句的监听你猜对了万能充

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

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

    设计模式之观察者模式1

    设计模式之观察者模式介绍观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个

    设计模式(十五)之观察者模式.zip

    观察者模式主要应用于一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态...当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。

    C# 观察者模式实例介绍

    当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。 观察者结构图: 使用场景:老板回来通知员工需要进入工作状态。 定义观察者的抽象类: 代码如下: ...

    js监听滚动条改变导航元素位置和样式.rar

    使用原生js获取浏览器可是高度,滚动条高度,监听滚动条,滑动时 触发 改变导航元素位置,和子元素样式,适合新手参考借鉴!

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

    说明: http://blog.csdn.net/yangzhaomuma/article/details/50967851

Global site tag (gtag.js) - Google Analytics