上一篇只是介绍了只有一个观察者的时候,是怎么实现的。但实际上,并不是这样的。因为一个被观察者可能会被多个观察者观察着呢。
因此在这一篇中将介绍使用JDK里面的Observable类和Observer接口来实现观察者与被观察者的关系。
从而实现有多个观察者的情况。
首先为韩非子定义一个类(HanFeiZi),它继承了JDK里面的java.util.Observable类:
/**
*
*/
package com.nantian.designmodel.observer1;
import java.util.Observable;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author ps
*
*/
public class HanFeiZi extends Observable {
protected static final Log log = LogFactory.getLog(HanFeiZi.class);
public void haveBreakfast() {
log.info("韩非子吃早餐了,赶紧通知李斯");
setChanged();
notifyObservers("报告,韩非子在吃早餐了!");//通知所有观察者
log.info("报告完毕!");
}
public void haveFun() {
log.info("韩非子出去活动了,赶紧通知李斯");
setChanged();
notifyObservers("报告,韩非子出去活动了!");//通知所有观察者
log.info("报告完毕!");
}
}
然后定义李斯(LiSi)来获取信息,它实现了(java.util.Observer):
/**
*
*/
package com.nantian.designmodel.observer1;
import java.util.Observable;
import java.util.Observer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author ps
*
*/
public class LiSi implements Observer {
protected static final Log log = LogFactory.getLog(LiSi.class);
/* (non-Javadoc)
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable o, Object arg) {
log.info("谁在报告:是我," + o.toString());
log.info("收到报告!" + arg.toString());
log.info("要有所行动了。");
}
}
如果还有其他观察者,比如:王斯、。。。。
都采用与李斯一样的定义方式。
然后定义一个客户端来运行它:
/**
*
*/
package com.nantian.designmodel.observer1;
/**
* @author ps
*
*/
public class ObserverClient {
/**
* @param args
*/
public static void main(String[] args) {
HanFeiZi feiZi = new HanFeiZi();
LiSi liSi = new LiSi();
feiZi.addObserver(liSi);
feiZi.haveBreakfast();
feiZi.haveFun();
}
}
如果有其他观察者,则在feiZi.addObserver(others);即可。
运行结果:
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.HanFeiZi haveBreakfast
信息: 韩非子吃早餐了,赶紧通知李斯
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 谁在报告:是我,com.nantian.designmodel.observer1.HanFeiZi@330e1567
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 收到报告!报告,韩非子在吃早餐了!
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 要有所行动了。
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.HanFeiZi haveBreakfast
信息: 报告完毕!
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.HanFeiZi haveFun
信息: 韩非子出去活动了,赶紧通知李斯
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 谁在报告:是我,com.nantian.designmodel.observer1.HanFeiZi@330e1567
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 收到报告!报告,韩非子出去活动了!
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.LiSi update
信息: 要有所行动了。
二月 11, 2012 4:09:36 下午 com.nantian.designmodel.observer1.HanFeiZi haveFun
信息: 报告完毕!
从结果来看基本与上一篇的结果是一致的。
这样就实现了观察者模式。
呵呵。。