JAVA ---Obsever模式

java语言里包含了许多对设计模式的直接支持,如command模式,agent模式,observer模式等。虽然java提供的对这些模式的支持很简单,不能满足比较复杂的应用。但在简单的场景下,使用这些类往往能够得到立杆见影的效果。所以,如果没有什么特殊需求,还是最好利用java的这些类。

Observer模式,又称监听模式,观察者模式,是经典设计模式之一(one of GOF)。java语言中,对这种模式支持的类和接口主要有以下几个,全部来自java.beans包:

java.beans.PropertyChangeListener (interface)

java.beans.PropertyChangeSupport (class)

java.beans.PropertyChangeEvent (class)

java.beans.PropertyChangeListener
这是一个接口,很显然,所有实现这个接口的类就是listener啦(或者叫observer),它会对被监听的对象的某些变化感兴趣。这个接口就一个方法:

java 代码
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
}

接口定义很简单,作用也很明显。接受一个event(被监听者产生的PropertyChangeEvent),然后根据这个event做点反应。

java.beans.PropertyChangeSupport
这个类用在被观察者的类里,用来保存注册的观察者,并负责向他们提供被观察者的变化信息。这个类的方法也不多,不过还是只介绍100%用到的,要不脑子就不够使了,呵呵。

java 代码
public PropertyChangeSupport(Object sourceBean)

这是构造函数,参数就是被监听者。PropertyChangeListener一般作为被监听者的一个属性。一般如下使用:

java 代码
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);

注意,这个listeners可不是只代表一个监听者,他可能是一群监听者。那么如何这些listeners是谁呢?这回用到下面的方法了。

java 代码
public void addPropertyChangeListener(PropertyChangeListener listener)

这个类太容易了,把监听者加进来。就像开十七大一样,记者想要采访,就得先登记一下。显然这个方法可以多次调用(add嘛)。有加就有减:

java 代码
public void removePropertyChangeListener(PropertyChangeListener listener)

如果这个监听者对被监听者的任何变化多不感兴趣了,就被被监听者赶了出去。

好了,记者都到齐了,被监听者有变化了就该通知人家了,使用如下方法的一个:

java 代码
public void firePropertyChange(PropertyChangeEvent evt)

public void firePropertyChange(String propertyName,
boolean oldValue,
boolean newValue)

public void firePropertyChange(String propertyName,
int oldValue,
int newValue)

public void firePropertyChange(String propertyName,
Object oldValue,
Object newValue)

实际上,后三个方法的参数都会封装成PropertyChangeEvent,然后调用第一个方法。不过在实际中,我们还是喜欢直接调用后三个中的一个,封装的事我们就不管了。后三个方法的参数都是三个,其中的oldValue和newValue就是改变前后的值,第一个就是给改变一个名字,好让监听者们根据这个名子来做响应。就像开会,政府的所有信息都会被记者听到,但是有的记者只对台湾问题感兴趣,而有的记者对中日问题感兴趣。

对PropertyChangeSupport方法的介绍就这么多吧。注意,PropertyChangeSupport既然被用到了被观察者的类(一般是一个model)里,那么他的这些方法就只在被观察这里调用。

java.beans.PropertyChangeEvent
这个类我也懒得介绍,看看他的主要方法就明白怎么回事了

java 代码
public String getPropertyName()
public Object getNewValue()
public Object getOldValue()

就者三个类,再有就是具体问题具体分析了。来个例子吧,首先是被观察者:

java 代码
public 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);
}
}

有人对Domain的三个属性感兴趣。下面就是这些人中的一个:

java 代码
public class SimpleObserver implements PropertyChangeListener {

....

@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals("Domain.name")){
//do some work
}
}

}

下面是个简单的测试类:

java 代码
public class SimpleTest{
public static void main(String[] args) {
SimpleObserver observer = new SimpleObserver();
Domain domain = new Domain();
domain.addPropertyChangeListener(observer);
domain.setName("yangsq");
......
}
}

很显然,可以观察到SimpleObserver中propertyChange方法的执行。


个人总结:

总体思路就是:
1、创建被观察者对象
2、创建观察者对象
3、将观察者和被观察者建立关系。在被观察者类里面创建PropertyChangeSupport对象,同时提供注册方法。

jdk这部分的源码还是比较清晰的,大概的思路,就先将观察者的信息注册到PropertyChangeSupport这里面,然后被观察者的属性变化以后,在调用
PropertyChangeSupport里面的方法来触发已经注册的观察者,从而实现观察者的监听。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值