zoukankan      html  css  js  c++  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");
    		}
    	}
    }

     http://blog.csdn.net/xyls12345/article/details/26386885

  • 相关阅读:
    poj 3590 The shuffle Problem——DP+置换
    poj 3128 Leonardo's Notebook——思路(置换)
    bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群
    bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)
    bzoj 3944 Sum —— 杜教筛
    bzoj 1367 [ Baltic 2004 ] sequence —— 左偏树
    bzoj 2093 [ Poi 2010 ] Frog —— 滑动窗口 + 倍增
    bzoj 2276 [ Poi 2011 ] Temperature —— 单调队列
    bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
    NOIP2007普及 守望者的逃离
  • 原文地址:https://www.cnblogs.com/softidea/p/4861218.html
Copyright © 2011-2022 走看看