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");
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值