一、定义
定义对象间一种一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被更新。
二、实例
一个专业的运动员,每时每刻都会有很多人围着他转,运动前教练要指导,队医可能需要记录数据;运动中和运动后教练啊、队医啊也都会有相应的动作。这个时候 就需要用到观察者模式。
定义一个被观察者接口,也就是运动员的接口。
public interface IAthlete {
public void start() ;
public void doIng() ;
public void end() ;
}
观察者接口
public interface IObserver {
public void action(String info);
}
串联被观察者和观察者的接口,这个接口由被观察者实例实现,被观察者一有什么动作就会通过这个接口的submitInfo函数传递出去 。
public interface IObservable {
public void addObserver(IObserver observer);
public boolean removeObserver(IObserver observer) ;
public void submitInfo(String info);
}
定义被观察者
public class Runner implements IAthlete,IObservable{
private ArrayList observers = new ArrayList();
@Override
public void addObserver(IObserver observer) {
this.observers.add(observer);
}
@Override
public boolean removeObserver(IObserver observer) {
return false;
}
@Override
public void submitInfo(String info) {
for (IObserver Observer : observers) {
Observer.action(info);
}
}
@Override
public void start() {
System.out.println("运动员准备跑步!");
this.submitInfo("start");
}
@Override
public void doIng() {
System.out.println("运动员正在跑步!");
this.submitInfo("ing");
}
@Override
public void end() {
System.out.println("运动员结束跑步!");
this.submitInfo("end");
}
}
医生实例:
public class Doctor implements IObserver {
@Override
public void action(String info) {
System.out.print("doctor:");
if(info.equals("start")){
System.out.println("运动员跑步前记录");
}else if (info.equals("ing")) {
System.out.println("运动员运动中检测");
}else if(info.equals("end")){
System.out.println("运动员运动后检测");
}
}
}
教练实例
public class Coach implements IObserver {
@Override
public void action(String info) {
System.out.print("coach:");
if(info.equals("start")){
System.out.println("运动员跑步前指导");
}else if (info.equals("ing")) {
System.out.println("运动员运动中观察");
}else if(info.equals("end")){
System.out.println("运动员运动后指导");
}
}
}
测试类
public class Test {
public static void main(String[] args) {
Doctor doctor = new Doctor();
Coach coach = new Coach();
Runner runner = new Runner();
runner.addObserver(coach);
runner.addObserver(doctor);
runner.start();
runner.doIng();
runner.end();
}
}
运行结果
运动员准备跑步!
coach:运动员跑步前指导
doctor:运动员跑步前记录
运动员正在跑步!
coach:运动员运动中观察
doctor:运动员运动中检测
运动员结束跑步!
coach:运动员运动后指导
doctor:运动员运动后检测
三、观察者和责任链
观察者模式是由被观察者产生一个消息,然后有一个或多个观察者产生反应,而如果观察者同时又是被观察者,那么这个
消息就可以像责任链模式那样不停的传递下去,不过不同的是这时候这个消息的内容可能已经被改变。
责任链模式就是将不属于自己的消息往后传递,这其中的消息并没有发生变化。