观察者模式
来源:互联网 发布:素描入门 知乎 编辑:程序博客网 时间:2024/06/05 17:38
观察者模式(发布订阅模式)
定义:定义对象间一种一对多的依赖关系,每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
关键:观察者类聚集到被观察者类上
通用类图
- Subject:被观察者,管理观察者并通知观察者
- ConcreteSubject:具体的被观察者
- Observer:观察者,对接收到的消息进行处理
- ConcreteObserver:具体的观察者
通用代码
/** * 被观察者 * @author wei.jiang * @since 2016-09-21 */public abstract class Subject { //定义一个存放观察者容器 private Vector<Observer> obs = new Vector<Observer>(); /** * 增加一个观察者 * @param o */ public void addObserver(Observer o){ obs.add(o); } /** * 删除一个观察者 * @param o */ public void removeObserver(Observer o){ obs.remove(o); } /** * 通知所以观察者 */ public void notifyObservers(){ for(Observer o : obs){ o.update(); } }}
/** * 具体的被观察者 * @author wei.jiang * @since 2016-09-21 */public class ConcreteSubject extends Subject { /** * 具体的业务 */ public void doSomething(){ super.notifyObservers(); }}
/** * 观察者 * @author wei.jiang * @since 2016-09-21 */public interface Observer { /** * 更新方法 */ public void update();}
/** * 具体的观察者 * @author wei.jiang * @since 2016-09-21 */public class ConcreteObserver implements Observer { /** * 具体的更新方法 */ @Override public void update() { System.out.println("接收消息并进行处理!"); }}
/** * 场景类 * @author wei.jiang * @since 2016-09-21 */public class Client { public static void main(String[] args) { //创建一个被观察者 ConcreteSubject cs = new ConcreteSubject(); //创建一个观察者 Observer o1 = new ConcreteObserver(); //观察者观察被观察者 cs.addObserver(o1); //观察者开始活动 cs.doSomething(); }}
注意事项:
触发链问题
类似于数据库触发器的触发器链问题。一个观察者可以有双重身份:既是观察者,又是被观察者。链路一旦建立,逻辑就相应变得复杂了,可维护性就变得困难。性能问题
java中消息是顺序执行的,一个观察者卡壳,会影响整体的执行效率。这种情况下一般采用异步的方式进行处理
0 0