一:观察者模式例子
附上源码:
类图参见书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 stub
this.observerList.add(observer);
}
public void deleteObserver(Observer observer) {
// TODO Auto-generated method stub
this.observerList.remove(observer);
}
public void notifyObservers(String context) {
// TODO Auto-generated method stub
for(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();
}
}