<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    J2EE,Documentum,GWT,EJB學習路程

    為了所愛的,和愛我的人努力

     

    2007.3.25-2007.4.6戰斗中----觀察者模式實踐 我的所有隨筆屬于個人總結,有不足之處請回復指出

     

    觀察者模式體驗就是一個:

          問題:在做UI設計時,遇到一個問題,就是當我點擊一個自定義對話框的復選框時,自定義對話框的父界面必須做出相應的改變,還有,自定義對話框是做成的組件,應用于很多場合(有很多的界面用到此對話框);

    //這是自定義的對話框,當事件是checkbox時,讓父界面做//出改變

    Public class DialogBox implements ClickListener {

          Public void onClick(event e){

          }

    }

    //這是父界面,他彈出對話框

    Public class ParentFrame extends ParentClass{

          Public void popDialogBox(){

               DialogBox dialogbox = new DialogBox(this) ;

          }

    }

          解決方案一:

                     我把父界面的父類改變成自定義的父類,讓父界面繼承自定義的父類:

    Public class DialogBox implements ClickListener{

          Private Ojbect object = null ;

          Private CheckBox checkbox = new CheckBox() ;

          Public DialogBox(Ojbect object){

               this.object = object ;

          }

          Public void onClick(event e){

             If(e == checkbox){

             //當事件是checkbox時,強制轉換成Custom調用//update方法

             ((Custom)object).update();

          }

       }

    }

    //這是自定義類,它繼承了ParentClass,并抽象了個update//

    Public abstact CustomClass extends ParentClass{

          Public abstract void update() ;

    }

    Public class ParentFrame extends CustomClass {

             Public void popDialogBox(){

               DialogBox dialogbox = new DialogBox(this) ;

             }

          Public void update(){

          //父界面的更新操作

          }

    }

    這個解決方案確實解決的問題,當自定義對話框點擊checkbox時,確實會使他的父界面發生改變,但他的缺點太大:必須繼承CustomClass才能具備這樣的功能,而且主要是因為他改變了繼承關系,在ParentFrameParentClass之間加了一層,這樣使耦合度加大了;而且每次都把自身的引用通過構造傳過去(new DialogBox(this)),在dialogbox那邊還要強行轉換回來,確實不是什么好辦法J

    解決方案二:

    //定義CustomListener接口

    Public interface CustomListener (){

          Public void update() ;

    }

    Public class DialogBox implements ClickListener{

          Private Ojbect object = null ;

          Private CheckBox checkbox = new CheckBox() ;

          Public DialogBox(Ojbect object){

               this.object = object ;

          }

          Public void onClick(event e){

          If(e == checkbox){

             //當事件是checkbox時,強制轉換成Custom調用//update方法

             ((CustomListener)object).update();

          }

       }

    }

    //實現了CustomListener接口

    Public class ParentFrame extends ParentClass implements CustomListener {

          Public void popDialogBox(){

               DialogBox dialogbox = new DialogBox(this) ;

          }

          Public void update(){

          //父界面的更新操作

          }

    }

    這個解決方案也是解決了問題,尤其對第一解決方案而言,這個已經不會打亂繼承關系,但是還沒有脫離第二個缺陷;

    解決方案三:

    //定義Listener接口

    Public interface CustomListener(){

          Public void update() ;

    }

    //定義event接口

    Public interface CustomEvent(){

          Public void addCustomListener(CustomListener listener) ;

          Public void removeCustomListener(CustomListener listner) ;

          Public void notify() ;

    }

    Public class DialogBox implements ClickListener, CustomEvent {

          Private List listenerList = new ArrayList() ;

          Private CheckBox checkbox = new CheckBox() ;

          Public DialogBox(Ojbect object){

               this.object = object ;

          }

          Public void onClick(event e){

             If(e == checkbox){

               notify() ;

             }

          }

          //注冊一個觀察者

          Public void addCustomListener(CustomListener listener) {

             listenerList.add(listener) ;

          }

          //刪除一個觀察者

          Public void removeCustomListener(CustomListener listner){

               listenerList.remove(listener) ;

          }

          //調用所以注冊的觀察者

          Public void notify() {

               If(listenerList != null && !( listenerList.isEmpty)){

                     for(int I = 0 ; I < listenerList.size() ; I ++){

                          ((CustomListener)listenerList.get(i)).update();

                      }

                   }

             }

    }

    //實現了CustomListener接口

    Public class ParentFrame extends ParentClass implements CustomListener {

          Public void popDialogBox(){

               DialogBox dialogbox = new DialogBox() ;

               dialogbox. addCustomListener((CustomListener)this) ;

          }

          Public void update(){

             //父界面的更新操作

          }

    }

    第三中解決方案才是觀察者模式是應用,這才是較為合理的方案;

    觀察者模式應用前提是:有一個對象出發事件時,其他對象也發生改變;是個一對多的關系

    posted on 2007-04-07 03:00 田亮 閱讀(1463) 評論(0)  編輯  收藏 所屬分類: 戰斗總結


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    MyHome

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲乱码国产乱码精品精| 亚洲Av无码一区二区二三区| 99热在线免费播放| 亚洲一区二区三区高清不卡 | 久久久亚洲欧洲日产国码二区| 国产免费毛不卡片| 少妇亚洲免费精品| 久久av无码专区亚洲av桃花岛| 国产成人高清精品免费软件| 国产精品免费高清在线观看| 亚洲成年网站在线观看| 亚洲小说区图片区另类春色| 最近2019中文字幕mv免费看| 国产成人无码精品久久久久免费 | 亚洲成年看片在线观看| 亚洲AV永久无码精品一区二区国产| 成全视频在线观看免费| 亚洲欧美日韩中文二区| 久久精品国产亚洲网站| 中文字幕av无码不卡免费| 亚洲日本乱码卡2卡3卡新区| 91麻豆精品国产自产在线观看亚洲 | 亚洲人成片在线观看| 在线观看亚洲天天一三视| 成年女人免费碰碰视频| 久久青草免费91观看| 无套内射无矿码免费看黄| 久久精品国产亚洲AV忘忧草18| 国产亚洲精品一品区99热| 无码欧精品亚洲日韩一区夜夜嗨| 日本免费网站视频www区| aa级毛片毛片免费观看久| 天天综合亚洲色在线精品| 亚洲an日韩专区在线| 亚洲人成网站影音先锋播放| 久久久久亚洲av成人无码电影 | 78成人精品电影在线播放日韩精品电影一区亚洲 | 日韩欧美亚洲国产精品字幕久久久 | 免费在线黄色网址| 毛片免费在线观看网站| 1000部拍拍拍18勿入免费凤凰福利|