观察者模式

观察者模式

一般我们理解的观察者是,一个观察者一直主动去观察被观察者,但是程序里的观察者和这种真正的【观察】略有不同,观察者不需要时刻盯着被观察者(例如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();

    }
}
posted @ 2020-09-25 18:28  刃牙  阅读(116)  评论(0编辑  收藏  举报