设计模式(十二):观察者模式
优点:
观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
缺点:
① 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
② 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
适用范围:
当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
客户端:
//被观察者
Subject s = new Secretary();
//两个观察者
Observer o1 = new StockObserver("张",s);
Observer o2 = new NBAObserver("李",s);
//拜托通知
s.addObserver(o1);
s.addObserver(o2);
//未通知
s.removeObserver(o1);
//观察结果
s.setAction("老板回来了");
//发出通知
s.tell();
一句话概括:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所依赖于它的对象都将得到通知并自动更新。
/** * Subject (被观察者接口,包括观察者(委托人)列表,增加和减少观察者(委托人)的方法,通知观察结果的方法) * Secretary (被观察者实例,前台秘书) - 观察者由直接观察实际情况,转为观察被观察者的状态,即等待被观察者发送提醒消息 * * Observer (观察者接口,委托的方法,改变当前行为的方法) * StockObserver (看股票的观察者) NBAObserver (看NBA的观察者) */