定义
- 概念
- 也称发布——订阅模式
- 模型——视图模式
- 源——监听器模式
- 从属者模式
定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,每当主题对象状态变化时,所有依赖于它的对象都会得到通知并自动更新。
- 核心
将观察者与被观察者解耦,类似于消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应
写法
阿里巴巴旗下的蚂蚁金服发出招聘请求,自动推送给人们
public class Alibaba extends Observable {
private String name = "蚂蚁金服";
//饿汉式单例写法
private static final Alibaba gper = new Alibaba();
private Alibaba() {}
public static Alibaba getInstance(){
return gper;
}
public String getName() {
return name;
}
public void publishHire(Hire hireMessage){
System.out.println(this.name+"发出了一个招聘请求,具体要求如下");
setChanged();
notifyObservers(hireMessage);
}
}
public class Hire {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
public class People implements Observer {
private String name;
public People(String name) {
this.name = name;
}
public void update(Observable o, Object arg) {
Alibaba alibaba = (Alibaba) o;
Hire hire = (Hire) arg;
System.out.println("======================");
System.out.println(name + "!你好!\n" +
"您收到了一个来自" + alibaba.getName() + "的招聘,要求如下如下:\n" +
hire.getContent()
);
}
}
public class Test {
public static void main(String[] args) {
Alibaba alibaba = Alibaba.getInstance();
People tyk = new People("Tyk");
alibaba.addObserver(tyk);
Hire hire = new Hire();
hire.setContent("大学本科及以上,很强很强的架构能力");
alibaba.publishHire(hire);
}
}
蚂蚁金服发出了一个招聘请求,具体要求如下
======================
Tyk!你好!
您收到了一个来自蚂蚁金服的招聘,要求如下如下:
大学本科及以上,很强很强的架构能力
JDK自带的Observable和Observer的API源码解读
- 可以看到Observable类里面有个Vector去装所有的观察者,在初始化时调用空构造器时就new出来实例了。
- 调用addObserver方法就是往这个Vector里面添加,addObserver里面调用的方法是Vector类的方法,就不往下追溯了
- setChanged就是改变那个changed的值
- notifyObservers就是先把Vector变成数组,修改changed为false,再依次调用观察者的update方法,传递的参数为被观察者对象的引用和雇佣要求(本例子中)