设计模式之观察者模式(行为型)

定义

  • 概念
    • 也称发布——订阅模式
    • 模型——视图模式
    • 源——监听器模式
    • 从属者模式
      定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,每当主题对象状态变化时,所有依赖于它的对象都会得到通知并自动更新。
  • 核心
    将观察者与被观察者解耦,类似于消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应

写法

阿里巴巴旗下的蚂蚁金服发出招聘请求,自动推送给人们

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方法,传递的参数为被观察者对象的引用和雇佣要求(本例子中)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值