首页 > 代码库 > java观察者模式

java观察者模式

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。


不多说了,直接给出实现:


例1:

/**
 * 对某个事件只有一个订阅者的例子
 * @author yongxing.shao
 *
 */
public class OneObserverExample {
	public static void main(String[] args) {
		IObserver observer = new Observer();
		EventNotifier notifier = new EventNotifier(observer);
		notifier.doWork();
	}
}

//对某事件感兴趣的观察者接口
interface IObserver {
	public void processInterestedEvent();
}

/**
 * 当一事件发生时,需要通知实现IObserver接口的对象,并调用interesingEvent()方法
 * @author yongxing.shao
 *
 */
class EventNotifier {
	private IObserver observer; //观察者
	private boolean somethingHappened; //标志事件是否发生
	
	public EventNotifier(IObserver observer) {
		this.observer = observer;
		this.somethingHappened = false;
	}
	
	public void doWork() {
		somethingHappened = true;
		if (somethingHappened) {
			//事件发生时,通过调用接口的这个方法来通知
			observer.processInterestedEvent();
		}
	}
}

/**
 * 观察者实现
 * @author yongxing.shao
 *
 */
class Observer implements IObserver {
	private EventNotifier en;
	
	public Observer() {
		//新建一个事件通知者对象,并把自己传递给它
		this.en = new EventNotifier(this);
	}
	
	//实现事件发生时,实际处理事件的方法
	public void processInterestedEvent() {
		System.out.println("Observer: event happened");
	}
}

例2:

/**
 * 对某个事件存在多个订阅者
 * @author yongxing.shao
 *
 */
public class ManyObserverExample {
	public static void main(String[] args) {
		EventNotifier notifier = new EventNotifier();
		
		IObserver observerA = new Observer("Observer A");
		IObserver observerB = new Observer("Observer B");
		
		//regist
		notifier.regist(observerA);
		notifier.regist(observerB);
		
		notifier.doWork();
	}
}

/**
 * 对某事件感兴趣的观察者接口
 * @author yongxing.shao
 *
 */
interface IObserver {
	public void processInterestedEvent(String event);
}

class Observer implements IObserver {
	private String name;
	
	public Observer(String name) {
		this.name = name;
	}
	
	//实现事件发生时,实际处理事件的方法
	public void processInterestedEvent(String event) {
		System.out.println(name + ": [" + event + "] happened.");
	}
}

/**
 * 当一事件发生时,需要通知实现IObserver接口的对象,并调用interesingEvent()方法
 * @author yongxing.shao
 *
 */
class EventNotifier {
	private List<IObserver> observers = new ArrayList<IObserver>(); //观察者
	
	public void regist(IObserver observer) {
		observers.add(observer);
	}
	
	public void doWork() {
		for (IObserver observer : observers) {
			observer.processInterestedEvent("sample event");
		}
	}
}