最新被阅读
· [原创]学习设计模式——监听者模式 [设计模式]
· JAVA非技术面试题--送给自己和青软的同学们 [职场]
· [顶]MyEclipse7.0 M1下载+汉化+注册码(转载) [常用软件]
· 如何设置把窗口最小化到系统托盘?(急) [C#]
· iframe怎么能自动调整大小把页面中的一个表格填满? [HTML]
· Linux命令行下如何显示中文? [Linux]
· eclipse问题 [Jsp/Servlet]
· 大家都来研究研究! [系统设计]
· 学习YUI.Ext 第四天  对话框Dialog的使用 [Ajax]
· 到底谁在主导公司的技术 [程序人生]

活动用户
· 新闻转播
· JavaSE
· soft
· 云中漫步
· 呼呼
· 学生问题
· 青软学生
· wen
· wuming
· Jack Lee(海洋)

社区信息
用户数量:1780
在线用户:0/9
文章数量:2783
问题数量:2686

反向链接
 http://www.google.com.br/s
 http://googleads.g.doublec
 http://www.tianya.cn/techf
 http://www.google.cn/searc
 http://www.soso.com/q?sp=S
 http://zhidao.baidu.com/qu
 http://zhidao.baidu.com/qu
 http://yule.wenda.sogou.co
 http://zhidao.baidu.com/qu
 http://zhidao.baidu.com/qu

赞助商链接
青软培训-软件培训专家
您的位置:首页文章Java基础设计模式[原创]学习设计模式——监听者模式
青岛青软职业培训学校 专业软件培训机构
Java基础: 全部  |  基础知识  |  Swing  |  JDBC  |  Eclipse  |  JavaME  |  Applet  |  设计模式
[原创]学习设计模式——监听者模式 [设计模式]
发布: UpDays 时间:2009-02-26 01:29:07 浏览:913 回复/评论:2

刚刚写了那么多,但是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看看代码,应该很容易就学会了。

青软培训-开始快乐的IT人生  咨询热线0532-85025005
[回复] 天上的云彩  | 2009-02-26 08:29:48

凌晨在学习。。。

青软培训-软件培训专家  咨询热线0532-85025005
[回复] UpDays  | 2009-02-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.     }  

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

青软培训针对大学生独立设计全新课程,让大学生毕业后拥有真正就业能力  咨询热线0532-85025005
您没有登录,不能回复(评论)。请您先登录

努力让生活更美丽!
鲁ICP备字080008353号
报名热线:0532-85025005(脱产班报名)  85025115(业余班报名)
青岛青软职业培训学校主办  地址:青岛市香港中路20号黄金广场北楼(市政府对面)  Copyright © 2008