《設計模式》一書對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

          主站蜘蛛池模板: 抚州市| 搜索| 西林县| 吴江市| 阿拉善盟| 思茅市| 望奎县| 天峻县| 临汾市| 交城县| 奉化市| 上高县| 望奎县| 嘉鱼县| 扬州市| 广丰县| 贵州省| 蒙自县| 灵川县| 翁源县| 丽水市| 平谷区| 洛浦县| 津市市| 葫芦岛市| 临漳县| 嘉禾县| 淮安市| 金塔县| 利津县| 波密县| 本溪市| 福鼎市| 云林县| 辽源市| 双鸭山市| 方城县| 衡阳市| 茌平县| 柳江县| 龙川县|