观察者模式
老板约谈
大家好,我叫小赵,目前在藏剑山庄任职高级铸剑师,我们的铸剑团队分为17个小组,高级铸剑师就是其中的小组长,小组长的主要工作就是管理小组的项目进度,并且处理一些剑农无法解决的技术问题。
记得有一次,我们一伙七八个小组长闲得蛋疼,围在一起唠嗑,唠着唠着不知道是谁从裤兜里掏了一副扑克牌出来,大伙沉默了一分钟,经过小声的交流确认之后,瞬间撸起袖子直接开干!
打牌的代码以省略号代替.......
只见控制台不断的输出信息:
老王:三带一。
老李:炸!报单!
老王:我炸!报单!
老李:王炸!
老王:我草!
......
三天后,老王被老板约谈。原因是那天老板来车间巡视,听到老王大叫一声 "草泥马!"。
通风报信的秘书
后来,老王去买通了老板身边的秘书,那个秘书在我印象中是个十足十的冰山美人,没想到老王确实有一套。
从此以后,只要老板要来车间,秘书就悄悄打个电话过来报信。
类图:
观察者抽象:
public interface IObserver { void update(String str);//行动 }
秘书:
public class Secretary implements IObserver { @Override public void update(String str) { System.out.println("秘书:老王!"+str); } }
被观察者抽象:
public interface IBoss { void coming();//老板来了 }
老板:
public class Boss implements IBoss { //老板身边的秘书 IObserver observer = new Secretary(); @Override public void coming() { System.out.println("老板走到门口..."); observer.update("老板来了!"); } }
主函数:
public static void main(String[] args) { Boss boss = new Boss(); boss.coming(); }
输出:
老板走到门口...
秘书:老王!老板来了!
多一个眼线,多一份平安
不久后,老王又被老板叫去办公室喝茶了,原因是有几天秘书身体不适没上班,以至于老王的真面目又一次被老板看到了,场面一度尴尬。
老王平安回来之后,大伙开了个紧急会议,为了避免万无一失,一名观察者是不够的!
老李去搞定人事部小美,老刘去搞定公司前台小玲。
大伙商定之后,我迅速开始做设计,画下类图:
观察者抽象:
public interface IObserver { void update(String str);//行动 }
秘书:
public class Secretary implements IObserver { @Override public void update(String str) { System.out.println("秘书:老王!"+str); } }
小美:
public class XiaoMei implements IObserver { @Override public void update(String str) { System.out.println("小美:老李!"+str); } }
小玲:
public class XiaoLing implements IObserver { @Override public void update(String str) { System.out.println("小玲:老刘!"+str); } }
老板行为抽象:
public interface IBoss { void coming();//老板来了 }
被观察者的管理抽象:
public interface IObservable { void add(IObserver observer);//增加观察者 void delete(IObserver observer);//删除观察者 void notifyObservers(String message);//通知观察者 }
老板:
public class Boss implements IBoss,IObservable { //老板身边的观察者 private ArrayList<IObserver> observers = new ArrayList<>(); @Override public void coming() { System.out.println("老板走到门口..."); this.notifyObservers("老板来了!"); } @Override public void add(IObserver observer) { this.observers.add(observer);//增加一个观察者 } @Override public void delete(IObserver observer) { this.observers.remove(observer);//删除一个观察者 } @Override public void notifyObservers(String message) { for(IObserver observer : this.observers){ observer.update(message);//给观察者发信息 } } }
主函数:
public static void main(String[] args) { //三个观察者 IObserver secretary = new Secretary(); IObserver xiaoMei = new XiaoMei(); IObserver xiaoLing = new XiaoLing(); //老板 Boss boss = new Boss(); //三个观察者在观察老板 boss.add(secretary); boss.add(xiaoMei); boss.add(xiaoLing); //老板来了 boss.coming(); }
输出:
老板走到门口...
秘书:老王!老板来了!
小美:老李!老板来了!
小玲:老刘!老板来了!
观察者模式
观察者模式又叫发布订阅模式。
观察者定义了一种一对多的依赖关系,多个观察者同时监听一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象。
使用场景:当一个对象的改变需要同时改变其他对象的时候,优先考虑观察者模式。