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 List<Observer> observers = new ArrayList<Observer>(); // 观察者列表 @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(); } }