设计模式之观察者模式

2019-04-14 19:08发布

一、定义
定义对象间一种一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被更新。 二、实例
一个专业的运动员,每时每刻都会有很多人围着他转,运动前教练要指导,队医可能需要记录数据;运动中和运动后教练啊、队医啊也都会有相应的动作。这个时候 就需要用到观察者模式。
定义一个被观察者接口,也就是运动员的接口。 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:运动员运动后检测 三、观察者和责任链
观察者模式是由被观察者产生一个消息,然后有一个或多个观察者产生反应,而如果观察者同时又是被观察者,那么这个
消息就可以像责任链模式那样不停的传递下去,不过不同的是这时候这个消息的内容可能已经被改变。
责任链模式就是将不属于自己的消息往后传递,这其中的消息并没有发生变化。