《設計模式》一書對Observer是這樣描述的:
          定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都將得到通知并自動更新。
          舉個例子,在現實生活中,父母與孩子是最親密的人。父母做為孩子(被觀察者)的監護人(觀察者),當孩子和別人打架后,一定會告訴他的父母這件事(呵呵,當孩子很小時,通常會告訴父母,長大了以后,可能不會,這里的孩子指的是小孩子),當孩子獲得獎學金后,也一定會告訴他的父母。下面我用Observer實現這個程序。代碼如下:
          import java.util.Vector;

          class Children{
           static private Vector<Observer> obs;
           static private String state=null;
           static{
            obs=new Vector<Observer>();
           }
           public static void attach(Observer o){
            obs.addElement(o);
           }
           public static void detach(Observer o){
            obs.removeElement(o);
           }
           public void setState(String str){
            state=str;
           }
           public String getState(){
            return state;
           }
           public void notifyObs(){
            for(Observer o:obs){
             o.update(this); 
            }
           }
          }
          interface Observer{
           public void update(Children child);
          }
          class Parent implements Observer{
           public void update(Children child){
            if(child.getState().equals("fight")){
             System.out.println("Parent,他和別人打架了");
            }else if(child.getState().equals("scholarship")){
             System.out.println("告訴Parent,他得到了獎學金");
            }
           }
          }
          class Mother implements Observer{
           public void update(Children child){
            if(child.getState().equals("fight")){
             System.out.println("告訴Mother,他和別人打架了");
            }else if(child.getState().equals("scholarship")){
             System.out.println("告訴Mother,他得到了獎學金");
            }
           }
          }
          public class Client {

           public static void main(String[] args) {
            Children child=new Children();
            Observer parent=new Parent();
            Observer mother=new Mother();
            child.attach(parent);
            child.attach(mother);
            child.setState("fight");
            child.notifyObs();
            child.setState("scholarship");
            child.notifyObs();

           }

          }

          輸出如下:
          告訴Parent,他和別人打架了
          告訴Mother,他和別人打架了
          告訴Parent,他得到了獎學金
          告訴Mother,他得到了獎學金
           小結:對于Observer模式,觸發事件的對象-Subject對象無法預測可能需要知道該事件的所有對象。為了解決這一問題,我們創建一個Observer接口,要求所有的Observer負責將自己注冊到Subject上。

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 甘孜| 高邮市| 墨江| 武宣县| 苏州市| 铜梁县| 吉木萨尔县| 桓台县| 黄平县| 陆河县| 军事| 苍梧县| 平阴县| 高邑县| 黑水县| 七台河市| 东宁县| 岐山县| 新昌县| 怀来县| 黑水县| 扎赉特旗| 赤水市| 齐齐哈尔市| 富民县| 衡南县| 馆陶县| 绥宁县| 丘北县| 新巴尔虎左旗| 商洛市| 吴江市| 清流县| 绥宁县| 开封县| 新民市| 吕梁市| 札达县| 江津市| 大连市| 渭源县|