1.观察者模式(Observer Pattern)
也叫发布订阅模式,定义对象间一种,一对多的依赖关系,使得当,一个对象状态改变时,所有依赖它的对象都能得到通知,并被自动更新2.类图如图
(1)Subject 被观查者 定义被观察者必须实现的职责。它必须能够,管理观察者(动态添加或删除观察者),通知观察者。(2)ConcreteSubject 具体的被观察者(3)Observer 观察者
接收到消息后,进行update(消息处理)操作(4)ConcreteObserver 具体观察者
3.关键,一个被观察者最好不要同时是观察者,否则这个关系很难维护(1)优点: 观察者和被观察者之间是抽象耦合,方便扩展 建立一套触发机制,触发链(2)观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发
和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响 整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。被观察者发生动作了, 观察者要做出回应, 如果观察者比较多, 而且处理时间比较长怎么办? 那就用异步呗(具体怎么异步)
代码:
Observable
package com.design.观察者模式;/** * * @author yafei.lv * 被观察者,要作的通知 */public interface Observable { void addObserver(Observer observer); //添加观察者 void deleteObserver(Observer observer); //减少观察者 void notifyObservers(String context);}
ObservableMotion
package com.design.观察者模式;/** * * @author yafei.lv * 被观察者,要做的动作 */public interface ObservableMotion { void haveBreakFast(); // 吃饭 void haveFun(); // 娱乐}
ObservableImpl
package com.design.观察者模式;import java.util.ArrayList;import java.util.List;/** * * @author yafei.lv * 被观察者实现 */public class ObservableImpl implements Observable,ObservableMotion { public Listobservers = new ArrayList (); // 观察者列表 @Override public void haveBreakFast() { notifyObservers("开始吃饭...."); } @Override public void haveFun() { notifyObservers("开始娱乐...."); } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void deleteObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers(String context) { for(Observer observer : observers){ observer.update(context); } }}
Observer
package com.design.观察者模式;/** * * @author yafei.lv * 观察者 */public interface Observer { void update(String context);}
ObserverLiSi
package com.design.观察者模式;public class ObserverLiSi implements Observer{ @Override public void update(String context) { System.out.println("观察者李斯,报告,被监控者有了活动:" + context); }}
ObserverZhaogao
package com.design.观察者模式;public class ObserverZhaogao implements Observer{ @Override public void update(String context) { System.out.println("观察者赵高,报告,被监控者有了活动:" + context); System.out.println("所以我也开始吃饭,赵高"); }}
场景类:
package com.design.观察者模式;/** * * @author yafei.lv * 场景类 */public class Main { public static void main(String[] args) { Observer observerLisi = new ObserverLiSi(); Observer observerZhaogao = new ObserverZhaogao(); ObservableImpl observable = new ObservableImpl(); observable.observers.add(observerZhaogao); observable.observers.add(observerLisi); observable.haveBreakFast(); observable.haveFun(); }}