[原创]学习设计模式——监听者模式
发布: 2009-2-26 01:29 | 作者: change | 来源: 青软培训-踏踏实实育人-勤勤恳恳奉献
刚刚写了那么多,但是session过期了,一下子都没了。。。
来来,今天学监听者模式,也称“观察者模式”。
其工作原理就是等,等被监听者有所改变,然后触发事件,处理事件。
一共有如下几个对象:
1.监听者 java.beans.propertychangelistener
2.监听器 java.beans.propertychangesupport
3.被监听者
4.事件 java.beans.propertychangeevent
其中有三个已经让jdk给封装了。余下的被监听者,其实就是一个bean,看代码:
java代码
然后,我们给它加上“监听器”:
java代码
对比一下就知道怎么回事了。
接下来,处理事件的监听者:
java代码
调用:
java代码
结果:
哦也也id
哦也也desname
哦也
哦也
结束,对照jdk看看代码,应该很容易就学会了。
来来,今天学监听者模式,也称“观察者模式”。
其工作原理就是等,等被监听者有所改变,然后触发事件,处理事件。
一共有如下几个对象:
1.监听者 java.beans.propertychangelistener
2.监听器 java.beans.propertychangesupport
3.被监听者
4.事件 java.beans.propertychangeevent
其中有三个已经让jdk给封装了。余下的被监听者,其实就是一个bean,看代码:
java代码
- class domain{
- protected string id;
- protected string name;
- protected string desname;
-
- public string getid() {
- return id;
- }
-
- public void setid(string id) {
- this.id = id;
- }
-
- public string getdesname() {
- return desname;
- }
-
- public void setdesname(string desname) {
- this.desname = desname;
- }
-
- public string getname() {
- return name;
- }
-
- public void setname(string name) {
- this.name = name;
- }
-
- }
然后,我们给它加上“监听器”:
java代码
- class domain{
- protected string id;
- protected string name;
- protected string desname;
-
- protected propertychangesupport listeners = new propertychangesupport(this);
-
- public string getid() {
- return id;
- }
-
- public void setid(string id) {
- this.id = id;
- firepropertychange("domain.id", null, id);
- }
-
- public string getdesname() {
- return desname;
- }
-
- public void setdesname(string desname) {
- this.desname = desname;
- firepropertychange("domain.desname", null, desname);
- }
-
- public string getname() {
- return name;
- }
-
- public void setname(string name) {
- this.name = name;
- firepropertychange("domain.name", null, name);
- }
-
- public void addpropertychangelistener(propertychangelistener listener) {
- listeners.addpropertychangelistener(listener);
- }
-
- public void firepropertychange(string propname, object oldvalue, object newvalue) {
- listeners.firepropertychange(propname, oldvalue, newvalue);
- }
-
- public void removepropertychangelistener(propertychangelistener listener) {
- listeners.removepropertychangelistener(listener);
- }
- }
对比一下就知道怎么回事了。
接下来,处理事件的监听者:
java代码
- class simpleobserver implements propertychangelistener {
-
- public void propertychange(propertychangeevent evt) {
- if(evt.getpropertyname().equals("domain.name")){
- /*
- system.out.println(evt.getoldvalue());
- system.out.println(evt.getnewvalue());
- system.out.println(evt.getpropagationid());
- system.out.println(evt.getpropertyname());
- system.out.println(evt.getsource());
- */
- system.out.println("哦也");
- }else
- {
- system.out.println("哦也也"+evt.getnewvalue());
- }
- }
- }
调用:
java代码
- public static void main(string[] args) {
- simpleobserver observer = new simpleobserver();
- domain domain = new domain();
- domain.addpropertychangelistener(observer);
- domain.setid("id");
- domain.setdesname("desname");
- domain.setname("chenyanji");
- domain.setname("cyj");
- }
结果:
哦也也id
哦也也desname
哦也
哦也
结束,对照jdk看看代码,应该很容易就学会了。





发现一个问题: 贴出来以免各们走弯路. 这是原来的帖子里的一段被监听者的代码
java代码
就是这个firepropertypchange方法让我出错了.
先解释一下三个参数:
第一个,给listener捕获用的名字
第二个,事件发生前的 旧值
第三个,事件发生时 产生的新值
注意: 如果给定事件的旧值和新值相等并且都是非 null 的,则不会激发事件。
所以,我把代码改成
java代码
就没问题了.希望大家多找找错.让我们共同进步!