java设计模式:观察者模式

转自:http://blog.csdn.net/zhengzhb/article/details/7471978

/*******************************************************************************
 * 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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值