观察者模式,主要意图是定义对象间一对多的关系,一个对象的状态有所改变,其他对象都能及时的得到通知并自动更新。利用观察者模式,将观察对象和其他对象之间解耦。
优点:观察者和被观察对象之间是解耦的
缺点:当观察对象过多时,广播的方式,会比较慢;其次,万一开发过程中,存在循环引用,那会无限通知下去。
关键代码:将观察对象放到一个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中的事件驱动模型,就是基于观察者模式来实现的。