日期:2014-05-17 浏览次数:20910 次
?
工作时间长了,会发现代码中的很多东西都是相通相似的,就说JAVA的事件机制其实就是观察者模式的实现,学会了观察者模式,事件机制自己无师自通,先以我的角度看看什么是观察者模式。
观察者模式,顾名思义,应该有观察者(抽象观察者“Observer”角色)和被观察者(抽象主题“Subject”角色),被观察者一旦有变化就通知观察者更新自己。
形象图:

下面是观察者模式的类图:

从我的角度简单点理解,我们知道面向对象编程不过是对象之间的相互调用,那么被观察者应该有个列表(List)来把所有观察者引用起来,当有事件要通知观察者时,我们从List中把所有观察者类取出来挨个调用观察者的方法(如update())。这个过程中只有充分利用了面向对象编程的多态,继承等特性才能实现。
下面是代码实现:
被观察者(抽象主题类):
package com.lifanghu.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author lifh
* @mail wslfh2005@163.com
* @since 2012-6-14 下午06:18:26
* @name com.lifanghu.observer.Subject.java
* @version 1.0
*/
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
/**
* 增加一个观察者
* @param observer
* @author lifh
*/
public void addObserver(Observer observer) {
observers.add(observer);
}
/**
* 删除一个观察者
* @param observer
* @author lifh
*/
public void removeObserver(Observer observer) {
observers.remove(observer);
}
/**
* 通知所有观察者
* @author lifh
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
}?
??
实际被观察者(真实主题角色):
package com.lifanghu.observer;
/**
* 实际被观察者
* @author lifh
* @mail wslfh2005@163.com
* @since 2012-6-14 下午10:48:02
* @name com.lifanghu.observer.XiaoMing.java
* @version 1.0
*/
public class XiaoMing extends Subject {
private String state;
//实际要通进行通知的方法
public void change() {
this.notifyObservers();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
??
抽象观察者:
package com.lifanghu.observer;
/**
* 实际观察者
* @author lifh
* @mail wslfh2005@163.com
* @since 2012-6-14 下午10:54:07
* @name com.lifanghu.observer.XiaoWang.java
* @version 1.0
*/
public class XiaoWang implements Observer {
public void update(Subject subject) {
XiaoMing xm = (XiaoMing) subject;
System.out.println("小王得到通知:" + xm.getState() + ";小王说:活该!");
}
}?
??
具体观察者1: