|
|
|
| 发布:
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代码
- 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("哦也");
- }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看看代码,应该很容易就学会了。
|
|
青软培训-开始快乐的IT人生 咨询热线0532-85025005
|
|
|
|
|
|
[回复]
UpDays
| 2009-02-26 15:55:37 |
|
呵呵,比较幸运-----早上写的代码,下午在工作上就用到了.
发现一个问题: 贴出来以免各们走弯路. 这是原来的帖子里的一段被监听者的代码
Java代码
- public void setName(String name) {
- this.name = name;
- firePropertyChange("Domain.name", null, name);
- }
就是这个firePropertypChange方法让我出错了.
先解释一下三个参数:
第一个,给Listener捕获用的名字
第二个,事件发生前的 旧值
第三个,事件发生时 产生的新值
注意: 如果给定事件的旧值和新值相等并且都是非 null 的,则不会激发事件。
所以,我把代码改成
Java代码
- public void setName(String name) {
- firePropertyChange("Domain.name", null, name);
- this.name = name;
- }
就没问题了.希望大家多找找错.让我们共同进步! |
|
青软培训针对大学生独立设计全新课程,让大学生毕业后拥有真正就业能力 咨询热线0532-85025005
|
|
|