您的位置:首页 > 其它

观察者模式

2015-08-11 15:59 399 查看
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

首先定义一个接口,负责对被观察者对象的属性更新

package com.test.observer;

/**
 * 被观察的对象接口
 * @author yuewen
 *
 */
// 抽象观察者角色
public interface ObserveTest {
	
	public void update(String str);
}


接下来定义一个主题角色的接口,提供对观察者的增加,删除,已经通知观察者

package com.test.observer;

/**
 * 主题角色的接口,在其中声明方法(添加、移除观察者,通知观察者)需要被主题观察者继承:
 * 
 * @author yuewen
 *
 */
public interface Observerd {

	public void addObServerd(ObserveTest o);

	public void removeObServer(ObserveTest o);

	public void notifyWatchers(String str);
}
被观察者,实现ObserverTest接口中更新属性的方法

package com.test.observer;

/**
 * 观察者
 * 
 * @author yuewen
 *
 */
public class Wachter implements ObserveTest {

	@Override
	public void update(String str) {
		System.out.println(str);
	}

}
主题角色,也正是负责观察对象已经通知被观察者对象的负责人,需要实现Observed的接口

package com.test.observer;

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

/**
 * 主题角色,负责存放被观察的对象以及更新对象的属性
 * 
 * @author yuewen
 *
 */
public class Conceter implements Observerd {

	// 存放需要观察的对象
	private List<ObserveTest> obServedObject = new ArrayList<ObserveTest>();

	@Override
	public void addObServerd(ObserveTest o) {
		obServedObject.add(o);
	}

	@Override
	public void removeObServer(ObserveTest o) {
		obServedObject.remove(o);
	}

	/**
	 * 该方法是核心,遍历所有的观察者依依更新观察者的属性,入参则是需要被观察对象需要更新的属性
	 */
	@Override
	public void notifyWatchers(String str) {
		if (!obServedObject.isEmpty() && !str.isEmpty() && str.trim() != "") {// 如果发生改变,则遍历存放观察者对象的信息并更新
			for (ObserveTest o : obServedObject) {
				// 更新对象
				o.update(str);
			}
		}
	}

}
测试类

package com.test.observer;

/**
 * 测试类
 * 
 * @author yuewen
 *
 */
public class MainTest {

	public static void main(String args[]) {
		// 被观察的对象1
		ObserveTest o1 = new Wachter();
		// 被观察对象2
		ObserveTest o2 = new Wachter();
		// 定义被观察的对象1的方法输出结果
		o1.update("hello");
		// 定义被观察的对象2的方法输出结果
		o2.update("world");
		// 主题角色,负责管理被观察者
		Conceter con = new Conceter();
		con.addObServerd(o1);
		con.addObServerd(o2);
		// 通知观察者,并改变原来对象的方法修改
		con.notifyWatchers("all changed");

	}
}


结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: