您的位置:首页 > 编程语言 > Java开发

java设计模式:观察者模式

2015-09-26 11:29 337 查看
转自:/article/1358567.html



/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

import java.util.Vector;

/**
 * @Created Sep 26, 2015 10:53:17 AM
 * @Description
 *              <p>
 *              抽象主题类:被观察者
 */
abstract class Subject {

	/**
	 * 一般一个被观察者拥有多个观察者,之所以使用Vector而不使用List,
	 * 是因为多线程操作时,Vector在是安全的,而List则是不安全的
	 */
	private final Vector<Observer> obs = new Vector<Observer>();

	/**
	 * @param obs
	 *            添加的观察者
	 */
	public void addObserver(final Observer obs) {
		this.obs.add(obs);
	}

	/**
	 * @param obs
	 *            移除的观察者
	 */
	public void delObserver(final Observer obs) {
		this.obs.remove(obs);
	}

	/**
	 * 依次通知所有观察者
	 */
	protected void notifyObserver() {
		for (final Observer o : obs) {
			o.update();// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
		}
	}

	/**
	 * 抽象主题类(被观察者)的具体实现类需要实现此抽象方法,
	 * 被观察者做完自己的时间后,notifyObserver()方法通知所有观察者
	 */
	public abstract void doSomething();
}


/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

/**
 * @Created Sep 26, 2015 10:54:19 AM
 * @Description
 *              <p>
 *              抽象主题类(被观察者)的具体实现类
 */
class ConcreteSubject extends Subject {

	@Override
	public void doSomething() {

		System.out.println("被观察者事件反生");// 被观察者做完这件事后,需要通知所有观察者我做了这件事

		notifyObserver();// 依次通知所有观察者
	}
}


/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

/**
 * @Created Sep 26, 2015 10:54:43 AM
 * @Description
 *              <p>
 *              观察者接口
 */
interface Observer {

	/**
	 * 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
	 */
	public void update();
}


/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

/**
 * @Created Sep 26, 2015 10:55:04 AM
 * @Description
 *              <p>
 *              观察者接口的 一个 具体实现类
 */
class ConcreteObserver1 implements Observer {

	@Override
	public void update() {// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理

		System.out.println("观察者1收到信息,并进行处理。");

	}
}


/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

/**
 * @Created Sep 26, 2015 10:55:21 AM
 * @Description
 *              <p>
 *              观察者接口的 一个 具体实现类
 */
class ConcreteObserver2 implements Observer {

	@Override
	public void update() {// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理

		System.out.println("观察者2收到信息,并进行处理。");

	}
}


/*******************************************************************************
 * Copyright (c) 2015, 2015 Hirain Technologies Corporation.
 ******************************************************************************/
package qqq;

/**
 * @Created Sep 26, 2015 10:55:41 AM
 * @Description
 *              <p>
 *              测试类
 */
public class Test {

	public static void main(final String[] args) {

		final Subject sub = new ConcreteSubject();// 定义一个被观察者

		sub.addObserver(new ConcreteObserver1()); // 添加观察者1
		sub.addObserver(new ConcreteObserver2()); // 添加观察者2

		sub.doSomething();// doSomething()内部有notifyObserver()方法去通知所有观察者

	}
}


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