java设计模式:观察者模式实例详解(基于java内置观察者)

观察者模式可以用下面这张图来解释


注:

1.接口:Subject,,是被观察者(数据转发中心),定义了三个方法,注册观察者,移除观察者,通知观察者三个主要的方法。

2.具体的被观察者:WeatherDataSt,数据转发中心,该类为Subject接口的具体实现。

3.接口:Observer,是观察者,即数据接收中心,定义了数据更新方法,即当数据中心数据发生变化时调用该方法更新数据

4.具体的观察者:CurrenConditions 实现了Observer接口是具体的观察者。

下面用一个例子来说明观察者模式的工作流程:

Data:封装数据用的对象

package com.tt.sso.test.obser;

/**
 * @author 作者 peng.tu
 * @version 创建时间:2016年1月20日
 */
public class Data {

	private String name; // 标题
	private String content; // 内容
	private String pubTime; // 发布时间

	public Data(String name, String content, String pubTime) {
		super();
		this.name = name;
		this.content = content;
		this.pubTime = pubTime;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getPubTime() {
		return pubTime;
	}

	public void setPubTime(String pubTime) {
		this.pubTime = pubTime;
	}

}

DataFactory : 具体的数据工厂

package com.tt.sso.test.obser;

import java.util.Observable;

/**
 * @author 作者 peng.tu
 * @version 创建时间:2016年1月20日
 */
public class DataFactory extends Observable {

	private Data data;

	/**
	 * 改变数据并且调用数据改变的方法
	 * @param data
	 */
	public void setData(Data data) {
		this.data = data;
		dataChange();
	}

	/**
	 * 数据发生了改变,需要通知所有观察者,因为使用的是java内置实现类,所以在通知所有观察者是必须调用setChange()方法,即告诉父类数据发生了变化
	 */
	private void dataChange() {
		this.setChanged();
		this.notifyObservers(data);
	}

}

Ob1 :观察者1

package com.tt.sso.test.obser;

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

/**
 * @author 作者 peng.tu
 * @version 创建时间:2016年1月20日
 */
public class Ob1 implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		display(arg);
	}
	
	private void display(Object arg){
		String name = ((Data)arg).getName();
		String content = ((Data)arg).getContent();
		String pubTime = ((Data)arg).getPubTime();
		System.out.println("OB1 : " + name);
		System.out.println("OB1 : " + content);
		System.out.println("OB1 : " + pubTime);
	}

}

Ob2 : 观察者2

package com.tt.sso.test.obser;

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

/**
 * @author 作者 peng.tu
 * @version 创建时间:2016年1月20日
 */
public class Ob2 implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		display(arg);
	}
	
	private void display(Object arg){
		String name = ((Data)arg).getName();
		String content = ((Data)arg).getContent();
		String pubTime = ((Data)arg).getPubTime();
		System.out.println("OB2 : " + name);
		System.out.println("OB2 : " + content);
		System.out.println("OB2 : " + pubTime);
	}

}
测试类
package com.tt.sso.test.obser;
/**
 * @author 作者 peng.tu
 * @version 创建时间:2016年1月20日
 */
public class DemoTest {

	public static void main(String[] args) {
		Ob1 ob1 = new Ob1();	//观察者1
		Ob2 ob2 = new Ob2();	//观察者2
		DataFactory factory = new DataFactory();	//数据转发工厂
		factory.addObserver(ob1);<span style="white-space:pre">	</span>//添加观察者1
		factory.addObserver(ob2);<span style="white-space:pre">	</span>//添加观察者2
		factory.setData(new Data("我们是程序猿", "听听新闻推荐:我们都是程序猿", "2016-01-20 15:05:43"));//工厂生成新的数据,并且通知观察者们
		System.out.println("----------------------------");
		factory.deleteObserver(ob1); //移除观察者1
		factory.setData(new Data("我们", "听听新闻推荐:", "2016-01-20 16:05:43"));<span style="font-family: Arial, Helvetica, sans-serif;">//工厂生成新的数据,并且通知观察者们</span>

	}
	
}
结果:

OB2 : 我们是程序猿
OB2 : 听听新闻推荐:我们都是程序猿
OB2 : 2016-01-20 15:05:43
OB1 : 我们是程序猿
OB1 : 听听新闻推荐:我们都是程序猿
OB1 : 2016-01-20 15:05:43
----------------------------
OB2 : 我们
OB2 : 听听新闻推荐:
OB2 : 2016-01-20 16:05:43

最后:Observable 是java内置的被观察者,内部预先定义了一些天假观察者,删除观察者,通知观察者等方法。 我们只需要继承它,想通知用户的时候调用其notifyObservers(Object obj);方法即可。而且我们的 观察者也要实现java内置的Observer接口,只需要 实现接口中的update方法即可,因为在被观察者通知观察者的时候调用的就是该接口的update()方法。

























  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值