设计模式-观察者模式的JDK实现

今天在翻查JAVA API的时候发现了特别的类java.util.Observable和接口
java.util.Observer,细看发现原来是java类库实现观察着(Observer)模式的类和接口。

[b]观察者模式定义:[/b]
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象Observer间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

[b]Observable和Observer的说明:[/b]
继承于Observable的子类表示被观察的对象,实现了接口Observer的类表示观察者.在下面的例子中继承于Observable的子类NewsDispatcher(新闻派发器)表示被观察的对象,在有新的新闻的时候会把新闻内容派发给所有的订阅者(Reader),Reader是实现了Observer接口的类表示读者。

[b]Observable的简单功能介绍:[/b]
addObserver(Observer o) 添加观察着
clearChanged() 清除变化,则把“变化标志”设为false
countObservers() 统计观察着数量
deleteObserver(Observer o) 删除观察者
deleteObservers() 删除所有的观察者
hasChanged() 测试是否有变化(则返回“变化标志”)
notifyObservers() 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法)
notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法),并把参数arg传过去
setChanged() 设置变化,则把“变化标志”设为true

[b]Observable的简单功能介绍[/b]
update(Observable o, Object arg) Observable唯一的方法,在被通知时被Observable调用

[b]例子代码:[/b]

package com.pasu.observer;

import java.util.Observable;
/**
* 新闻派发器,当有新的新闻时派发给所有的订阅读者(观察者)
* @author pasu
* @vesion 1.0, 2009-3-25
*
*/
public class NewsDispatcher extends Observable
{
/**
* 添加新闻的时候,把新闻内容发给所有的定义者
* @param news
*/
public void addNews(String news)
{
this.setChanged();
this.notifyObservers(news);
}
}



package com.pasu.observer;

import java.util.Observable;
import java.util.Observer;
/**
* 读者(观察者)
* @author pasu
* @vesion 1.0, 2009-3-25
*
*/
public class Reader implements Observer
{
private String name;

public Reader(String name)
{
this.name = name;
}

@Override
public void update(Observable o, Object arg)
{
String news = (String)arg;
System.out.println(name + " : " + news);
}


}



package com.pasu.observer;
/**
* 测试类
* @author pasu
* @vesion 1.0, 2009-3-25
*
*/
public class Test
{
public static void main(String[] args)
{
//体育新闻派发器
NewsDispatcher sportNewsDispatcher = new NewsDispatcher();
//it新闻派发器
NewsDispatcher itNewsDispatcher = new NewsDispatcher();
//观察者r1,r2,r3
Reader r1 = new Reader("r1");
Reader r2 = new Reader("r2");
Reader r3 = new Reader("r3");
//添加观察者
sportNewsDispatcher.addObserver(r1);
sportNewsDispatcher.addObserver(r2);
itNewsDispatcher.addObserver(r3);
//当有新的新闻的时候,通知观察者
sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!");
itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!");
}
}


Test类运行输出的结果

r2 : 中国队突破了历史,获得了世界杯冠军!
r1 : 中国队突破了历史,获得了世界杯冠军!
r3 : ibm 收购 sun公司,java开始收费!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值