`
todd841026
  • 浏览: 8178 次
  • 性别: Icon_minigender_1
  • 来自: 河北
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

         //父界面的更新操作

      }

}

第三中解决方案才是观察者模式是应用,这才是较为合理的方案;

观察者模式应用前提是:有一个对象出发事件时,其他对象也发生改变;是个一对多的关系



田亮 2007-04-07 03:00 发表评论
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics