[一次]設計モード--オブザーバーモード


/**
 *         
 *   :
 * 	    ,    
 * 	    ,    
 */
public class ObserverDemo01 {
	public static void main(String[] args) throws InterruptedException {
		MyBaby b = new MyBaby();
		MyParent p1 = new MyParent("  ");
		MyParent p2 = new MyParent("  ");
		MyParent p3 = new MyParent("  ");
		MyParent p4 = new MyParent("  ");
		b.addObserver(p1);
		b.addObserver(p2);
		b.addObserver(p3);
		b.addObserver(p4);
		for(int i=0;i<5;i++){
			Thread.sleep(1000);
			if(b.isAwake()){
				b.sleep();
			}else{
				b.wakeUp();
			}
		}
	}
}

/**
 *    
 */
interface IMyObserver{
	void update(MyObservable obs);
}
/**
 *     
 */
class MyObservable{
	protected List<IMyObserver> list = new ArrayList<IMyObserver>();
	
	public void addObserver(IMyObserver obs){
		list.add(obs);
	}
	public void removeObserver(IMyObserver obs){
		list.add(obs);
	}
	public void notifyAllObservers(){
		for (IMyObserver obs : list) {
			obs.update(this);
		}
	}
}
/**
 *       、      
 */
class MyBaby extends MyObservable{
	private boolean isAwake = false;
	public boolean isAwake(){
		return this.isAwake;
	}
	public void wakeUp(){
		System.out.println("baby  ");
		this.isAwake = true;
		notifyAllObservers();
	}
	public void sleep(){
		System.out.println("baby  ");
		this.isAwake = false;
		notifyAllObservers();
	}
}
class MyParent implements IMyObserver{
	private String name;
	public MyParent(String name){
		this.name = name;
	}
	@Override
	public void update(MyObservable obs) {
		if( ((MyBaby)obs).isAwake() ){
			System.out.println("["+name+"]   ");
		}else{
			System.out.println("["+name+"]   ");
		}
	}
}

実行結果:
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   

 
 
/**
 *      (JDK         )
 * 
 * 	1、      (baby)   java.util.Observable
 * 		        (  )     setChanged()   notifyObservers()       
 * 	2、     (parent)   java.util.Observer    update()   
 * 	3、                       (addObserver()  )
 * 
 * 	    /    ,                
 * 	   /              
 * 
 *   :
 * 	1、           deleteObserver()           
 * 		                            
 * 	2、      (   )
 * 	3、       
 * 
 *     :
 * 	    、AWT、Android
 */
public class ObserverDemo02 {
	public static void main(String[] args) throws InterruptedException {
		Baby b = new Baby();
		Parent p1 = new Parent("  ");
		Parent p2 = new Parent("  ");
		Parent p3 = new Parent("  ");
		Parent p4 = new Parent("  ");
		b.addObserver(p1);
		b.addObserver(p2);
		b.addObserver(p3);
		b.addObserver(p4);
		for(int i=0;i<5;i++){
			Thread.sleep(1000);
			if(b.isAwake()){
				b.sleep();
			}else{
				b.wakeUp();
			}
		}
	}
}
class Baby extends Observable{
	private boolean isAwake = false;
	public boolean isAwake(){
		return this.isAwake;
	}
	public void wakeUp(){
		System.out.println("baby  ");
		this.isAwake = true;
		setChanged();
		notifyObservers();
	}
	public void sleep(){
		System.out.println("baby  ");
		this.isAwake = false;
		setChanged();
		notifyObservers();
	}
}
class Parent implements Observer{
	private String name;
	public Parent(String name){
		this.name = name;
	}
	@Override
	public void update(Observable o, Object arg) {
		if( ((Baby)o).isAwake() ){
			System.out.println("["+name+"]   ");
		}else{
			System.out.println("["+name+"]   ");
		}
	}
}

実行結果(上):
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   
baby  
[  ]   
[  ]   
[  ]   
[  ]   

  
 
/**
 *   ,      
 *   
 *    
 */
public class ObserverDemo03 {
	public static void main(String[] args) throws InterruptedException {
		String[] arr = {"  ","  ","   "};
		YiJia yijia = new YiJia(arr);
		XiaoTou dnw = new XiaoTou("   ",yijia);
		XiaoHu hu = new XiaoHu();
		yijia.addObserver(hu);
		for(int i=0;i<arr.length;i++){
			dnw.tou();
			Thread.sleep(1000);
		}
	}
}
/**
 *    
 */
class YiJia extends Observable{
	private int initSize;
	private String[] arr;
	public YiJia(String[] arr){
		this.arr = arr;
		this.initSize = arr.length;
	}
	public int getInitSize(){
		return initSize;
	}
	public void get(XiaoTou xt){
		int index = arr.length-1;
		String oldVal = arr[index];
		System.out.println("====["+xt.name+"]   ["+oldVal+"]");
		xt.hold = oldVal;
		String[] newArr = new String[index];
		System.arraycopy(arr, 0, newArr, 0, index);
		arr = newArr;
		setChanged();
		notifyObservers(xt);
	}
}
/**
 *   (   )
 */
class XiaoTou{
	private YiJia yijia;
	String name;
	String hold;
	public XiaoTou(String name, YiJia yijia){
		this.name = name;
		this.yijia = yijia;
	}
	public void tou(){
		yijia.get(this);
	}
}
/**
 *   
 */
class XiaoHu implements Observer{
	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof XiaoTou){
			System.out.println("  ,   *"+((XiaoTou)arg).hold+"* !");
			System.out.println("  ?");
			System.out.println(((XiaoTou)arg).name);
		}
	}
}

実行結果:
====[   ]   [   ]
  ,   *   * !
  ?
   
====[   ]   [  ]
  ,   *  * !
  ?
   
====[   ]   [  ]
  ,   *  * !
  ?