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

本文深入解析观察者模式,介绍其核心概念与实现原理,并通过一个具体的招聘案例展示如何使用该模式来实现对象间的解耦与联动。代码示例基于Java语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

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

写法

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

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方法,传递的参数为被观察者对象的引用和雇佣要求(本例子中)
回答: 当使用php-fpm生成core dump时,可以使用gdb进行调试。需要注意的是,由于生成core dump的是php-fpm,所以需要使用php-fpm进行调试。如果是在cli模式下使用php生成的core dump,则需要使用php程序进行调试。在调试过程中,可以查看调用栈信息来定位问题。例如,在调试过程中,可以使用gdb命令查看主函数的调用栈信息,如#17 0x00000000006ed0ba in main (argc=2, argv=0x7fff4efcb2a8) at /root/php-5.3.27/sapi/fpm/fpm/fpm_main.c:1929。同时,还可以使用gdb命令查看php执行脚本的调用栈信息,如#16 0x000000000058056c in php_execute_script (primary_file=0x7fff4efcb080) at /root/php-5.3.27/main/main.c:2316。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [使用GDB调试PHP core dump](https://blog.youkuaiyun.com/weixin_29748637/article/details/115987071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件](https://blog.youkuaiyun.com/weixin_40004960/article/details/115941227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值