Java Observer 观察者模式 程序 总结

  观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

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

  

public class:

package com.observer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class MainTest {

    public static void main(String[] args) {
        Child c = new Child();

        Properties props = new Properties();
        try {
            props.load(MainTest.class.getClassLoader().getResourceAsStream("observer.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        String []observers = props.getProperty("observers").split(",");
        for(String s : observers) {
            try {
                c.addWakenUpListener((WakenUpListener) Class.forName(s).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        new Thread(c).start();
    }
}

抽象主题角色类

package com.observer;

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

/**
 * 一个主题对象,主题对象状态发生变化时,会通知所有观察者
 * @author IRON_MAN
 *
 */
class Child implements Runnable {

    /**
     * 把所有观察者对象的引用保存在List中
     */
    private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>();

    /**
     * 保存添加观察者对象
     * @param wakenUpListener
     */
    public void addWakenUpListener(WakenUpListener wakenUpListener) {
        wakenUpListeners.add(wakenUpListener);
    }

    /**
     * 通知所有观察者对象
     */
    void wakeUp() {
        System.out.println("wake");
        for(int i = 0; i < wakenUpListeners.size(); i++) {
            WakenUpListener wakenUpListener = wakenUpListeners.get(i);
            wakenUpListener.actionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "a", this));
        }
    }

    @Override
    public void run() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.wakeUp();

    }
}

 抽象观察者角色类

 

package com.observer;

public interface WakenUpListener {
    public void actionToWakenUp(WakenUpEvent wakeUpEvent);
}

 具体观察者角色类

 

package com.observer;

/**
 * 观察者Dad,可自动更新自己
 * @author IRON_MAN
 *
 */
class Dad implements WakenUpListener {
    public void actionToWakenUp(WakenUpEvent wakenUpEvent) {
        System.out.println("feed");
    }
}
package com.observer;

/**
 * 观察者GrandFather
 * @author IRON_MAN
 *
 */
class GrandFather implements WakenUpListener {
    public void actionToWakenUp(WakenUpEvent wakeUpEvent) {
        System.out.println("hug");
    }
}

抽象事件类

package com.observer;

class WakenUpEvent {
    private long time;
    private String loc;
    private Child source;

    public WakenUpEvent(long time, String loc, Child source) {
        super();
        this.time = time;
        this.loc = loc;
        this.source = source;
    }

    public long getTime() {
        return time;
    }
    public String getLoc() {
        return loc;
    }
    public Child getSource() {
        return source;
    }
    public void setTime(long time) {
        this.time = time;
    }
    public void setLoc(String loc) {
        this.loc = loc;
    }
    public void setSource(Child source) {
        this.source = source;
    }
}

配置properties文件

observers=com.observer.Dad,com.observer.GrandFather
时间: 2024-10-12 10:52:39

Java Observer 观察者模式 程序 总结的相关文章

java中观察者模式Observable和Observer

25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到. 实际上以上的购房者就是观察者,他们所关注的房价就是被观察者 其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口 具体实现如下 房价的实现 1 class House extends

Java对观察者模式的支持

在Java语言的Java.util库里面,提供了一个observable类以及一个observer接口,构成Java语言对观察者模式的支持. 下面直接看如何使用Java对观察者模式的支持: 在下面的例子里,被观察者对象叫做watched,也就是被监视着:而观察者对象叫做watcher,也就是监视人的意思. watched对象继承自observable类,而watcher对象实现了observer接口. /** * 被监视着对象 */ public class Watched extends Ob

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

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

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 2.模式特点: 观察者模式

Java设计模式の观察者模式(推拉模型)

目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者定义 在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)

设计模式 ( 十七 ):Observer 观察者模式 -- 行为型

1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允

Java的观察者模式

在慕课网上学习了观察者模式,故做个笔记温习巩固一下http://www.imooc.com/learn/415 自己写一个经典观察者模式 观察者模式定义 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到了通知并自动更新. 好处:统一通知,各自处理. 认识观察者(六大方面): 1.目标与观察者之间的关系(1VS1.1VSn.nVS1) 2.单向依赖(又称为订阅发布模式) 3.命名建议 ?1.目标接口的定义,建议在名称后跟Subject ?2.观察者接口的定

Java设计模式----观察者模式详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3899208.html 联系方式:[email protected] [正文] 一.观察者模式的定义: 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象.这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新.例如:GUI中的事件

Java里观察者模式(订阅发布模式)

创建主题(Subject)接口 创建订阅者(Observer)接口 实现主题 实现观察者 测试 总结 在公司开发项目,如果碰到一些在特定条件下触发某些逻辑操作的功能的实现基本上都是用的定时器 比如用户注册完后,发送邮件,为了防止邮件发送失败或者发送邮件比较耗时,一般也都是通过定时器去扫库里注册没有发邮件的用户数据 再比如一个订单,在改变状态后,要归档,这也是通过定时器来实现的,扫描订单的数据,通过判断状态来做相对应的处理 但这样处理的话,定时器就会越来越多,总觉得不太好 然后,从一些资讯网站上的