[原创]学习设计模式——监听者模式

发布: 2009-2-26 01:29 | 作者: change | 来源: 青软培训-踏踏实实育人-勤勤恳恳奉献

刚刚写了那么多,但是session过期了,一下子都没了。。。
来来,今天学监听者模式,也称“观察者模式”。
其工作原理就是等,等被监听者有所改变,然后触发事件,处理事件。

一共有如下几个对象:
1.监听者    java.beans.propertychangelistener
2.监听器    java.beans.propertychangesupport
3.被监听者
4.事件    java.beans.propertychangeevent

其中有三个已经让jdk给封装了。余下的被监听者,其实就是一个bean,看代码:

java代码

       
  1. class domain{      
       
  2.     protected string id;      
       
  3.     protected string name;      
       
  4.     protected string desname;      
       
  5.       
       
  6.     public string getid() {      
       
  7.         return id;      
       
  8.     }      
       
  9.       
       
  10.     public void setid(string id) {      
       
  11.         this.id = id;      
       
  12.     }      
       
  13.       
       
  14.     public string getdesname() {      
       
  15.         return desname;      
       
  16.     }      
       
  17.       
       
  18.     public void setdesname(string desname) {      
       
  19.         this.desname = desname;      
       
  20.     }      
       
  21.       
       
  22.     public string getname() {      
       
  23.         return name;      
       
  24.     }      
       
  25.       
       
  26.     public void setname(string name) {      
       
  27.         this.name = name;      
       
  28.     }      
       
  29.       
       
  30. }  


然后,我们给它加上“监听器”:


java代码

       
  1. class domain{      
       
  2.     protected string id;      
       
  3.     protected string name;      
       
  4.     protected string desname;      
       
  5.       
       
  6.     protected propertychangesupport listeners = new propertychangesupport(this);      
       
  7.       
       
  8.     public string getid() {      
       
  9.         return id;      
       
  10.     }      
       
  11.       
       
  12.     public void setid(string id) {      
       
  13.         this.id = id;      
       
  14.         firepropertychange("domain.id", null, id);      
       
  15.     }      
       
  16.       
       
  17.     public string getdesname() {      
       
  18.         return desname;      
       
  19.     }      
       
  20.       
       
  21.     public void setdesname(string desname) {      
       
  22.         this.desname = desname;      
       
  23.         firepropertychange("domain.desname", null, desname);      
       
  24.     }      
       
  25.       
       
  26.     public string getname() {      
       
  27.         return name;      
       
  28.     }      
       
  29.       
       
  30.     public void setname(string name) {      
       
  31.         this.name = name;      
       
  32.         firepropertychange("domain.name", null, name);      
       
  33.     }      
       
  34.       
       
  35.     public void addpropertychangelistener(propertychangelistener listener) {      
       
  36.         listeners.addpropertychangelistener(listener);      
       
  37.     }      
       
  38.       
       
  39.     public void firepropertychange(string propname, object oldvalue, object newvalue) {      
       
  40.         listeners.firepropertychange(propname, oldvalue, newvalue);      
       
  41.     }      
       
  42.       
       
  43.     public void removepropertychangelistener(propertychangelistener listener) {      
       
  44.         listeners.removepropertychangelistener(listener);      
       
  45.     }      
       
  46. }  


对比一下就知道怎么回事了。

接下来,处理事件的监听者:

java代码

       
  1. class simpleobserver implements propertychangelistener {      
       
  2.            
       
  3.     public void propertychange(propertychangeevent evt) {      
       
  4.         if(evt.getpropertyname().equals("domain.name")){   
       
  5.             /*  
       
  6.             system.out.println(evt.getoldvalue());  
       
  7.             system.out.println(evt.getnewvalue());  
       
  8.             system.out.println(evt.getpropagationid());  
       
  9.             system.out.println(evt.getpropertyname());  
       
  10.             system.out.println(evt.getsource());  
       
  11.             */  
       
  12.             system.out.println("哦也");   
       
  13.         }else  
       
  14.         {   
       
  15.             system.out.println("哦也也"+evt.getnewvalue());   
       
  16.         }   
       
  17.     }         
       
  18. }  


调用:

java代码

       
  1. public static void main(string[] args) {         
       
  2.         simpleobserver observer = new simpleobserver();         
       
  3.         domain domain = new domain();         
       
  4.         domain.addpropertychangelistener(observer);         
       
  5.         domain.setid("id");   
       
  6.         domain.setdesname("desname");   
       
  7.         domain.setname("chenyanji");      
       
  8.         domain.setname("cyj");      
       
  9.     }   


结果:
哦也也id
哦也也desname
哦也
哦也

结束,对照jdk看看代码,应该很容易就学会了。
2009-2-26 08:29:48
凌晨在学习。。。
2009-2-26 15:55:37
呵呵,比较幸运-----早上写的代码,下午在工作上就用到了.
发现一个问题: 贴出来以免各们走弯路.  这是原来的帖子里的一段被监听者的代码

java代码

       
  1. public void setname(string name) {           
       
  2.         this.name = name;           
       
  3.         firepropertychange("domain.name", null, name);           
       
  4.     }  


就是这个firepropertypchange方法让我出错了.
先解释一下三个参数:
第一个,给listener捕获用的名字
第二个,事件发生前的 旧值
第三个,事件发生时 产生的新值

注意:   如果给定事件的旧值和新值相等并且都是非 null 的,则不会激发事件。
所以,我把代码改成

java代码

       
  1. public void setname(string name) {           
       
  2.         firepropertychange("domain.name", null, name);           
       
  3.         this.name = name;           
       
  4.     }  


就没问题了.希望大家多找找错.让我们共同进步!
Google




姓名:
电话:
QQ或MSN:
您也可以拨打青软培训咨询电话预定周末免费技术讲座:    0532-85025005
王老师 尚老师 吴老师 于老师 谷老师

优秀就业学员

    青软培训-软件培训专家-王阿秀-青岛仁科 青软培训-软件培训专家-张琦-上海商联科技-JavaEE软件开发 青软培训-软件培训专家-刘奇-山东拓能集团-ASP.NET软件开发 青软培训-软件培训专家-郑磊-青岛乾懿德-网络部经理