观察者模式
一般我们理解的观察者是,一个观察者一直主动去观察被观察者,但是程序里的观察者和这种真正的【观察】略有不同,观察者不需要时刻盯着被观察者(例如A不需要每隔1ms就检查一次B的状态),二是采用注册(Register)或者成为订阅(Subscribe)的方式告诉被观察者:我需要你的某某状态,你要在它变化时通知我。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。
观察者模式又称为发布订阅模式,其实发布订阅模式更加贴切。
角色
抽象的Subject,抽象的观察者Observer,以及它们的实现类
Subject通过将Observer加入到自己的成员变量中来通知观察者。
案例
一个主题,很多人订阅了,一旦主题发生改变就通知观众可以更新了,大家快来看。
/**
* 节目抽象类
*/
public abstract class Subject {
private List<Audience> list = new ArrayList<>();
public void add(Audience audience) {
list.add(audience);
}
public final void notifyAudiences() {
list.forEach(Audience::watch);
}
}
public class Person implements Audience {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void watch() {
System.out.println(name + "来看节目");
}
}
public class Main {
public static void main(String[] args) {
//创建节目
AppSubject subject = new AppSubject();
//设置订阅的观众
subject.add(new Person("tom"));
subject.add(new Person("jack"));
subject.add(new Person("xiaoming"));
//节目更新来
subject.update();
}
}