J2EE,Documentum,GWT,EJB學(xué)習(xí)路程

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

           

          2007.3.25-2007.4.6戰(zhàn)斗中----觀察者模式實(shí)踐 我的所有隨筆屬于個(gè)人總結(jié),有不足之處請(qǐng)回復(fù)指出

           

          觀察者模式體驗(yàn)就是一個(gè):

                問題:在做UI設(shè)計(jì)時(shí),遇到一個(gè)問題,就是當(dāng)我點(diǎn)擊一個(gè)自定義對(duì)話框的復(fù)選框時(shí),自定義對(duì)話框的父界面必須做出相應(yīng)的改變,還有,自定義對(duì)話框是做成的組件,應(yīng)用于很多場(chǎng)合(有很多的界面用到此對(duì)話框);

          //這是自定義的對(duì)話框,當(dāng)事件是checkbox時(shí),讓父界面做//出改變

          Public class DialogBox implements ClickListener {

                Public void onClick(event e){

                }

          }

          //這是父界面,他彈出對(duì)話框

          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){

                   //當(dāng)事件是checkbox時(shí),強(qiáng)制轉(zhuǎn)換成Custom調(diào)用//update方法

                   ((Custom)object).update();

                }

             }

          }

          //這是自定義類,它繼承了ParentClass,并抽象了個(gè)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(){

                //父界面的更新操作

                }

          }

          這個(gè)解決方案確實(shí)解決的問題,當(dāng)自定義對(duì)話框點(diǎn)擊checkbox時(shí),確實(shí)會(huì)使他的父界面發(fā)生改變,但他的缺點(diǎn)太大:必須繼承CustomClass才能具備這樣的功能,而且主要是因?yàn)樗淖兞死^承關(guān)系,在ParentFrameParentClass之間加了一層,這樣使耦合度加大了;而且每次都把自身的引用通過構(gòu)造傳過去(new DialogBox(this)),在dialogbox那邊還要強(qiáng)行轉(zhuǎn)換回來,確實(shí)不是什么好辦法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){

                   //當(dāng)事件是checkbox時(shí),強(qiáng)制轉(zhuǎn)換成Custom調(diào)用//update方法

                   ((CustomListener)object).update();

                }

             }

          }

          //實(shí)現(xiàn)了CustomListener接口

          Public class ParentFrame extends ParentClass implements CustomListener {

                Public void popDialogBox(){

                     DialogBox dialogbox = new DialogBox(this) ;

                }

                Public void update(){

                //父界面的更新操作

                }

          }

          這個(gè)解決方案也是解決了問題,尤其對(duì)第一解決方案而言,這個(gè)已經(jīng)不會(huì)打亂繼承關(guān)系,但是還沒有脫離第二個(gè)缺陷;

          解決方案三:

          //定義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() ;

                   }

                }

                //注冊(cè)一個(gè)觀察者

                Public void addCustomListener(CustomListener listener) {

                   listenerList.add(listener) ;

                }

                //刪除一個(gè)觀察者

                Public void removeCustomListener(CustomListener listner){

                     listenerList.remove(listener) ;

                }

                //調(diào)用所以注冊(cè)的觀察者

                Public void notify() {

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

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

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

                            }

                         }

                   }

          }

          //實(shí)現(xiàn)了CustomListener接口

          Public class ParentFrame extends ParentClass implements CustomListener {

                Public void popDialogBox(){

                     DialogBox dialogbox = new DialogBox() ;

                     dialogbox. addCustomListener((CustomListener)this) ;

                }

                Public void update(){

                   //父界面的更新操作

                }

          }

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

          觀察者模式應(yīng)用前提是:有一個(gè)對(duì)象出發(fā)事件時(shí),其他對(duì)象也發(fā)生改變;是個(gè)一對(duì)多的關(guān)系

          posted @ 2007-04-07 03:00 田亮 閱讀(1461) | 評(píng)論 (0)編輯 收藏

          eclipse font

          由于長(zhǎng)期使用eclipse最好把編碼字體調(diào)大,以使眼睛可以得到一定的保護(hù);
          windows->preferences->General->apperance->colors?and?fonts

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

          GWT中remove的小問題 我的所有隨筆屬于個(gè)人總結(jié),有不足之處請(qǐng)回復(fù)指出

          在GWT中,在widget的方法remove是非常常用的,但請(qǐng)您好好注意一個(gè)小問題:
               當(dāng)你用循環(huán)remove時(shí),請(qǐng)注意最好使用倒循環(huán),因?yàn)槿绻阋怯谜h(huán)的話,remove一個(gè)widget后,他的下個(gè)widget就會(huì)到他的“位置”,例如:
                int count = widgetPanel.getWidgetCount() ;
                for(int i = 0 ; i < count ; i ++ )
                {
                     widgetPanel.remove(i) ;
                }
           這樣肯定會(huì)出異常的;
           因?yàn)楫?dāng)你remove掉第一個(gè)widget后,第二個(gè)widget就變成第一個(gè)widget了,所以,當(dāng)你認(rèn)為remove掉第二個(gè)時(shí),其實(shí)是把原來的第三個(gè)widget給remove掉了;
          解決方案:
          1.倒循環(huán):
                int count = widgetPanel.getWidgetCount() ;
                for(int i = count - 1 ; i >= 0 ; i -- )
                {
                     widgetPanel.remove(i) ;
                }
          這樣就不會(huì)出現(xiàn)以上的情況:)
          2.remove第一個(gè);
             int count = widgetPanel.getWidgetCount() ;
                for(int i = 0 ; i < count ; i ++ )
                {
                     widgetPanel.remove(0) ;
                }
          這種方法,也正說明了GWT轉(zhuǎn)換成javascript后的特性,它是根據(jù)remove的元素,在他父元素里的“位置”進(jìn)行remove,這點(diǎn)是和Swing最大的區(qū)別,一定要注意喲:)

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

          一個(gè)被忽略的接口實(shí)現(xiàn)問題 我的所有隨筆屬于個(gè)人總結(jié),有不足之處請(qǐng)回復(fù)指出

             今天同事在寫一個(gè)類時(shí),繼承了一個(gè)類,實(shí)現(xiàn)了自定義接口;可發(fā)現(xiàn)自定義接口里的一些方法不用寫竟然編譯器不報(bào)錯(cuò)。
             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
                      }
                }
             在編譯器中這個(gè)沒有報(bào)錯(cuò);
             我首先考慮到的是編譯器出錯(cuò),然后重新啟動(dòng)編譯器,竟然還是沒有錯(cuò);
             

             后來知道是SuperClass里已經(jīng)實(shí)現(xiàn)了這些方法;
             其實(shí)這一個(gè)小小的問題已經(jīng)充分說明面向?qū)ο蟮乃枷脒\(yùn)用不是很純熟 ;
             一個(gè)類的所有特性是先從父類繼承下來;你可以去override他的方法,但要知道一個(gè)類的開始永遠(yuǎn)是從根類進(jìn)行延伸下來的,這是面向?qū)ο蟮乃季S。

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

          僅列出標(biāo)題
          共2頁(yè): 上一頁(yè) 1 2 

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          MyHome

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 洪江市| 花莲县| 七台河市| 都江堰市| 探索| 壶关县| 灵台县| 赣榆县| 浦县| 正镶白旗| 北安市| 乡城县| 清水县| 南溪县| 垫江县| 滨州市| 沈丘县| 五常市| 罗甸县| 山阴县| 大余县| 巩留县| 盱眙县| 彭水| 菏泽市| 黄陵县| 建平县| 绥宁县| 萨迦县| 商城县| 眉山市| 墨江| 盘山县| 古田县| 阳西县| 从化市| 长寿区| 新密市| 芦溪县| 黑龙江省| 辰溪县|