Java观察者模式(Observer Pattern),简单说观察者模式包含四种角色:抽象被观察者角色、具体被观察者角色、抽象观察者角色和具体观察者角色;
针对观察者与被观察者设定场景:每天我们关心的天气预报统一由中国气象局发布(被观察者),每个发布气象平台(观察者)订阅中国气象局;天气发生变化气象局发布通知给各个平台,然后平台做相应的更新操作。当然,现实中该场景是不存在的,权宜是为了加深理解Java观察者模式而生,因为气象局是不会去通知各个订阅平台,更新操作是各个平台定时刷新完成。
其中Java本身提供观察者模式的接口供开发者使用,在 java.util包下,包含接口Observer及类Observable,接口Observer是扮演抽象观察者角色,包含一个update()方法,而类Observable则扮演抽象被观察者角色,开发者只需要继承该类就能很好的运用观察者模式。闲话少说,贴出代码以供参考:
抽象被观察者角色
/**
* @author effine
* @date 2013年10月4日 下午11:02:21
*/
package cn.effine.observer;
/* 抽象被观察者角色 */
public interface IWitched {
/* 添加观察者 */
public void addWitcher(IWitchers w);
/* 删除观察者 */
public void deleteWitcher(IWitchers w);
/* 被观察者 发生变化,通知观察者 */
public void notifyWitcher(Object o);
}
具体被观察者角色
/**
* @author effine
* @date 2013年10月4日 下午11:15:20
*/
package cn.effine.observer;
import java.util.ArrayList;
import java.util.List;
/* 具体被观察者角色 */
public class ConcreteWitched implements IWitched {
/* save witchers list */
private List<IWitchers> list = new ArrayList<IWitchers>();
@Override
public void addWitcher(IWitchers w) {
list.add(w);
}
@Override
public void deleteWitcher(IWitchers w) {
list.remove(w);
}
@Override
public void notifyWitcher(Object o) {
for (IWitchers l : list) {
l.update(o);
}
}
}
抽象观察者角色
/**
* @author effine
* @date 2013年10月4日 下午11:06:57
*/
package cn.effine.observer;
/* 抽象观察者角色 */
public interface IWitchers {
/* 当被观察者发生变化,接到通知做出反应,更新操作 */
public void update(Object o);
}
具体观察者角色
/**
* @author effine
* @date 2013年10月4日 下午11:16:56
*/
package cn.effine.observer;
/* 具体观察者角色 */
public class ConcreteWitchers implements IWitchers {
@Override
public void update(Object o) {
System.out.println(o);
}
}
测试类
/**
* @author effine
* @date 2013年10月4日 下午11:27:18
*/
package cn.effine.observer;
/* 测试类 */
public class TestWitch {
public static void main(String[] args) {
/* witched : girl */
IWitched girl = new ConcreteWitched();
/* witchers */
IWitchers witcher1 = new ConcreteWitchers();
IWitchers witcher2 = new ConcreteWitchers();
IWitchers witcher3 = new ConcreteWitchers();
/* witched add witchers */
girl.addWitcher(witcher1);
girl.addWitcher(witcher2);
girl.addWitcher(witcher3);
girl.notifyWitcher(args);
}
}