<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 @ 2007-04-07 03:00 田亮 閱讀(1456) | 評論 (0)編輯 收藏

    eclipse font

    由于長期使用eclipse最好把編碼字體調大,以使眼睛可以得到一定的保護;
    windows->preferences->General->apperance->colors?and?fonts

    posted @ 2007-03-27 15:21 田亮 閱讀(589) | 評論 (0)編輯 收藏

    GWT中remove的小問題 我的所有隨筆屬于個人總結,有不足之處請回復指出

    在GWT中,在widget的方法remove是非常常用的,但請您好好注意一個小問題:
         當你用循環remove時,請注意最好使用倒循環,因為如果你要是用正循環的話,remove一個widget后,他的下個widget就會到他的“位置”,例如:
          int count = widgetPanel.getWidgetCount() ;
          for(int i = 0 ; i < count ; i ++ )
          {
               widgetPanel.remove(i) ;
          }
     這樣肯定會出異常的;
     因為當你remove掉第一個widget后,第二個widget就變成第一個widget了,所以,當你認為remove掉第二個時,其實是把原來的第三個widget給remove掉了;
    解決方案:
    1.倒循環:
          int count = widgetPanel.getWidgetCount() ;
          for(int i = count - 1 ; i >= 0 ; i -- )
          {
               widgetPanel.remove(i) ;
          }
    這樣就不會出現以上的情況:)
    2.remove第一個;
       int count = widgetPanel.getWidgetCount() ;
          for(int i = 0 ; i < count ; i ++ )
          {
               widgetPanel.remove(0) ;
          }
    這種方法,也正說明了GWT轉換成javascript后的特性,它是根據remove的元素,在他父元素里的“位置”進行remove,這點是和Swing最大的區別,一定要注意喲:)

    posted @ 2007-03-21 01:46 田亮 閱讀(1284) | 評論 (1)編輯 收藏

    一個被忽略的接口實現問題 我的所有隨筆屬于個人總結,有不足之處請回復指出

       今天同事在寫一個類時,繼承了一個類,實現了自定義接口;可發現自定義接口里的一些方法不用寫竟然編譯器不報錯。
       For Example:
          public interface IExample()
          {
                public void setName(String userName) ;
                public void setText(String text) ;
                public void setHtml(String html) ;
          }
          public class Example extends SuperClass implements IExample
          {
                public void setName(String userName)
                {
                      //do something
                }
          }
       在編譯器中這個沒有報錯;
       我首先考慮到的是編譯器出錯,然后重新啟動編譯器,竟然還是沒有錯;
       

       后來知道是SuperClass里已經實現了這些方法;
       其實這一個小小的問題已經充分說明面向對象的思想運用不是很純熟 ;
       一個類的所有特性是先從父類繼承下來;你可以去override他的方法,但要知道一個類的開始永遠是從根類進行延伸下來的,這是面向對象的思維。

    posted @ 2007-03-12 12:58 田亮 閱讀(967) | 評論 (0)編輯 收藏

    僅列出標題
    共2頁: 上一頁 1 2 

    導航

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    MyHome

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级毛片大全免费播放| 国产精品成人免费综合| eeuss影院ss奇兵免费com| 亚洲日本乱码卡2卡3卡新区| 久久国产精品亚洲综合| 免费99热在线观看| 一个人免费观看在线视频www | 成人A级毛片免费观看AV网站| 精品无码国产污污污免费网站国产| 亚洲日韩中文字幕无码一区| 亚洲视频网站在线观看| 亚洲乱码精品久久久久..| 又黄又爽的视频免费看| 99久久免费精品国产72精品九九| 免费无遮挡无码永久视频| 国产无遮挡又黄又爽免费网站| 污视频网站在线免费看| 亚洲av成人一区二区三区观看在线 | 久久久久久99av无码免费网站| 全黄大全大色全免费大片| 在线看片免费人成视频久网下载| 午夜亚洲乱码伦小说区69堂| 亚洲中文字幕无码av永久| 亚洲国色天香视频| 亚洲AV人无码激艳猛片| 亚洲AV无码成人网站久久精品大| 国产偷窥女洗浴在线观看亚洲| 无码不卡亚洲成?人片| 四虎永久免费影院| 日日AV拍夜夜添久久免费| 女人被男人躁的女爽免费视频| 亚洲一区免费在线观看| 永久在线观看www免费视频| 久久永久免费人妻精品下载| 无码精品人妻一区二区三区免费看| 女同免费毛片在线播放| 免费看搞黄视频网站| 无码国产精品一区二区免费式芒果 | 毛片大全免费观看| 女人18毛片特级一级免费视频| 拨牐拨牐x8免费|