老板出差了,员工1、员工2..均放羊中。他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行。秘书想了想,说————嗯,这是观察者模式。
当一个对象的改变需要同时改变其它对象,而且它不知道具体有多少方法需要改变时,应该考虑使用观察者模式————摘自《大话设计模式》
Ps:本例用Java类库中的Observable和Observer实现
基本结构:
①、抽象通知者,接口
抽象的通知方法
②、通知者,继承Observable
通知方法,在该方法内条件判断setChange的执行与否,继而决定后续的notifyObservers是否执行
③、观察者,实现Observer接口
覆写的update方法,当“通知者”的notifyObservers方法执行时,update被调用
④、调用者
创建通知者A
创建观察者B
通过addObserver方法建立委托关系
调用通知方法
代码演示:文章开篇的例子
①、抽象通知者#########################################
/** * 抽象的通知者 */ public interface Subject { public void setAction(String action); //设置行为 public String getAction(); //获取行为 public void inform(); }
②、通知者#########################################
/** * 秘书,当老板回来时通知观察者 */ public class Secretary extends Observable implements Subject{ private String action; //行为 @Override public void inform(){ if(action!=null && !"".equals(action)){ this.setChanged();//只有当改变发生时,即setChange方法被触发时,才调用下面的通知方法notifyObservers } this.notifyObservers();//调用各个观察者的update方法 } @Override public String getAction() { return action; } @Override public void setAction(String action) { this.action = action; } }
③、观察者#########################################
/** * 观察者1,正在打魔兽 */ public class Member1 implements Observer{ String name; //观察者姓名 public Member1(String name){ this.name = name; } public void stopGame(){ //停止游戏 System.out.println(name+"请停止打魔兽,继续工作!"); } @Override public void update(Observable o, Object arg) { Subject sub = (Subject) o; System.out.print(sub.getAction()+","); //得到行为 stopGame(); } }
/** * 观察者2,正在大声谈笑 */ public class Member2 implements Observer{ String name; //观察者姓名 public Member2(String name){ this.name = name; } public void stopNoise(){ //停止游戏 System.out.println(name+"请停止喧闹,继续工作!"); } @Override public void update(Observable o, Object arg) { Subject sub = (Subject) o; System.out.print(sub.getAction()+","); //得到行为 stopNoise(); } }
④、调用者#########################################
public class Test { public static void main(String[] args) throws Exception { Secretary s = new Secretary(); Member1 m1 = new Member1("张三"); //成员1 Member2 m2 = new Member2("李四"); //成员2 s.addObserver(m1); //成员1建立委托 s.addObserver(m2); //成员2建立委托 s.setAction("老板回来啦"); s.inform(); //通知 } }
运行结果:
老板回来啦,李四请停止喧闹,继续工作!
老板回来啦,张三请停止打魔兽,继续工作!