一日一设计模式0708——观察者模式

154 阅读1分钟

观察者模式,主要意图是定义对象间一对多的关系,一个对象的状态有所改变,其他对象都能及时的得到通知并自动更新。利用观察者模式,将观察对象和其他对象之间解耦。

优点:观察者和被观察对象之间是解耦的

缺点:当观察对象过多时,广播的方式,会比较慢;其次,万一开发过程中,存在循环引用,那会无限通知下去。

关键代码:将观察对象放到一个list里面,通知时遍历list即可。

java 实现:

/**
 * @author:shiweili
 * @create:2020-07-08
 * @description: 被观察的对象,主要是要实现被观察者要包含一个所有观察者的list
 **/
public class Subject {
    // 关键代码,必须持有一个这样的可以引用到其他观察者的list,来做通知
    private List<AbstractObserver> observers = new ArrayList<>();
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }
    public void attach(AbstractObserver o) {
        observers.add(o);
    }
    public void notifyAllObservers() {
        observers.stream().forEach(o -> o.update());
   }
}

/**
 * @author:shiweili
 * @create:2020-07-08
 * @description: 定义一个这样的观察者,用抽象类或者接口定义,里面实现公共方法,一般建议用抽象类
 * 这样有个好处,就是可以持有一个公共的引用,不需要在每个观察者里面添加引用。
 **/
public abstract class AbstractObserver {
    protected Subject subject;
    public abstract void update();
}

/**
 * @author:shiweili
 * @create:2020-07-08
 * @description: 这个就是我们实际的观察者
 **/
public class Xiaoming extends AbstractObserver {
    public Xiaoming(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        System.out.println("更新了,更新了" + this.subject.getState());
    }
}

观察者模式,也可以叫做发布订阅模式,在Spring中的事件驱动模型,就是基于观察者模式来实现的。