熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

重用java.util.Observable類

2013-11-23 19:21:31  來源: Java核心技術 

  通常你可以完全開發一套自己的Listener/Event(監聽器/事件)系統但是在Java標准庫中已經有了現存的通用解決方案使用它可以節約大量的時間
  
  
  在Java庫中事件和監聽器的使用是很普遍的這些都只是觀察者(Observer)模式的例子Java Uitl包中提供了一個Observable/Observer對雖然並不是非常強大但在很多場合下仍然有用
  
  下面的三個類演示了使用Observer/Observable類的一種方式
  
  
  
  
  import javautil*;
  public class OEventManager extends Observable {
  static public void main(String[ ] args) {
  OEventManager mgr = new OEventManager( );
  mgraddObserver( new OListener( ) );
  mgraddObserver( new OListener( ) );
  mgraddObserver( new OListener( ) );
  mgrfireChange(Changed );
  }
  public void fireChange(String msg) {
  setChanged( );
  notifyObservers( new OEvent(msg));
  }
  }
  class OListener implements Observer {
  public void update(Observable o Object arg) {
  Systemerrprintln(Passed +arg+ by +o+ to +this);
   }
   }
  class OEvent extends EventObject {
  public OEvent(String msg) {
  super(msg);
  }
  }
  一個需要注意的要點是OEvent類把事件消息存儲在源中通常情況下這兒應該存儲的是激發事件的對象並且事件消息也應該存儲在單獨的域中但是這兒這樣做是出於簡潔的目的
  
  另一個需要注意的是Observable的setChanged方法的使用如果Observable沒有發生變化它並不通知觀察者相反它僅簡單地忽略對notifyObservers方法的調用
  
  下面是例子程序的輸出
  
  Passed OEvent[source=Changed ] by OEventManager@ca to OListener@be
  Passed OEvent[source=Changed ] by OEventManager@ca to OListener@cfe
  Passed OEvent[source=Changed ] by OEventManager@ca to OListener@fcd
  因為Observer接口強制了update(Observable Object)方法簽名(signature)所以Observer/Observable類並不能替代你自己定義的Event/Listener類當該接口可以接受時它們是一個有用的工具
  

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26709.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.