日期:2014-05-17 浏览次数:20772 次
?
工作时间长了,会发现代码中的很多东西都是相通相似的,就说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: