观察者模式

来源:互联网 发布:素描入门 知乎 编辑:程序博客网 时间: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