2014/7/21 观察者模式

来源:互联网 发布:约会吧是什么软件 编辑:程序博客网 时间:2024/05/29 15:08

一:观察者模式例子

附上源码:

类图参见书p268:

IHanFeiZi.java

package observePattern2;//被观察者接口public interface IHanFeiZi {public void haveBreakfast();public void haveFun();}

Observable.java

package observePattern2;//被观察者接口public interface Observable {public void addObserver(Observer observer);//增加一个观察者public void deleteObserver(Observer observer);//删除一个观察者public void notifyObservers(String context);}

HanFeiZi.java

package observePattern2;import java.util.ArrayList;public class HanFeiZi implements IHanFeiZi,Observable{//实现IHanFeiZi接口中的方法public void haveBreakfast() {System.out.println("韩非子:开始吃饭了");this.notifyObservers("韩非子在吃饭");//通知所有的观察者}public void haveFun() {System.out.println("韩非子:开始娱乐了");this.notifyObservers("韩非子在娱乐");}private ArrayList<Observer> observerList = new ArrayList<Observer>();public void addObserver(Observer observer) {// TODO Auto-generated method stubthis.observerList.add(observer);}public void deleteObserver(Observer observer) {// TODO Auto-generated method stubthis.observerList.remove(observer);}public void notifyObservers(String context) {// TODO Auto-generated method stubfor(Observer observer : observerList)observer.update(context);}}

Observer.java

package observePattern2;public interface Observer {public void update(String context);}

LiSi.java

package observePattern2;public class LiSi implements Observer{    //实现Observer接口中的方法public void update(String context) {System.out.println("李斯:观察到韩非子活动,开始向老板汇报了");this.reportToQinShiHuang(context);System.out.println("李斯:汇报完毕\n");}private void reportToQinShiHuang(String reportContext){System.out.println("李斯:报告,秦老板!韩非子有行动了--->"+reportContext);}}

WangSi.java

package observePattern2;public class WangSi implements Observer{public void update(String context) {System.out.println("王斯:观察到韩非子活动,开始向老板汇报了");this.reportToQinShiHuang(context);System.out.println("王斯:汇报完毕\n");}private void reportToQinShiHuang(String reportContext){System.out.println("王斯:报告,秦老板!韩非子有行动了--->"+reportContext);}}

Client.java

package observePattern2;public class Client {public static void main(String[] args){Observer lisi = new LiSi();Observer wangsi = new WangSi();HanFeiZi hanFeiZi = new HanFeiZi();hanFeiZi.addObserver(lisi);hanFeiZi.addObserver(wangsi);hanFeiZi.haveBreakfast();}}

二:观察者模式的定义

模式中的角色名称

1.Subject被观察者:必须的3个方法是增加,删除,通知观察者

2.Observer观察者:观察者从被观察者那里接受到消息后,进行update操作

3.ConcreteSubject具体被观察者:

4.ConcreteObserver具体观察者:

模板源码如下:

Subject.java

package observePattern;import java.util.Vector;//被观察者public abstract class Subject{//观察者数组private Vector<Observer> obsVector = new Vector<Observer>();public void addObserver(Observer o){this.obsVector.add(o);}public void delObserver(Observer o){this.obsVector.remove(o);}public void notifyObservers(){for(Observer o : this.obsVector){o.update();}}}

ConcreteSubject.java

package observePattern;//具体的被观察者public class ConcreteSubject extends Subject{public void doSomething(){//业务处理super.notifyObservers();}}

Observer.java

package observePattern;//观察者public interface Observer{public void update();}

ConcreteObserver.java

package observePattern;public class ConcreteObserver implements Observer{public void update() {System.out.println("接受到消息,进行处理");}}

Client.java

package observePattern;public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer obs = new ConcreteObserver();subject.addObserver(obs);subject.doSomething();}}



0 0
原创粉丝点击