设计模式(观察者模式)

设计模式(观察者模式)

第三章 设计模式之观察者模式

观察者模式介绍

观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有的依赖对象都会自动收到通知。一般情况下,被依赖的对象叫做被观察者(Observeable) ,依赖的对象叫作观察者(Observer)

不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么称呼,只要应用场景符合刚刚给出的定义,都可以看做观察者模式。

实际上,观察者模式是一个比较抽象的模式,根据不同的应用场景和需求,有完全不同的实现方式。下面讲到的是其中最经典的一种实现方式。

示例程序

Subject 被观察者接口
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:10
 * 被观察者接口
 */
public interface Subject {

    /**
     * 注册观察者
     * @param observer 观察者
     */
    void register(Observer observer);

    /**
     * 移除观察者
     * @param observer 观察者
     */
    void remove(Observer observer);

    /**
     * 通知观察者
     * @param message 消息
     */
    void notifyObserver(String message);
}
Observer 观察者接口
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:11
 * 观察者接口
 */
public interface Observer {
    /**
     * 观察者执行
     * @param message 消息
     */
    void execute(String message);
}
NotifySubject 被观察者实现类
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:13
 */
public class NotifySubject implements Subject {

    List<Observer> observers = new ArrayList<>();

    @Override
    public void register(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void remove(Observer observer) {
        observers.remove(observer);
    }
    @Override
    public void notifyObserver(String message) {
        for (Observer observer : observers) {
            observer.execute(message);
        }
    }
}
SendMsgObserver
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:13
 */
public class SendMsgObserver implements Observer {
    @Override
    public void execute(String message) {
        System.out.println("发送短信,内容为:" + message);
    }
}
CallObserver
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:15
 */
public class CallObserver implements Observer {
    @Override
    public void execute(String message) {
        System.out.println("打电话,内容为:" + message);
    }
}
Main函数
typescript 复制代码
/**
 * @author maomao
 * @date 2025/1/10
 * @time 16:15
 */
public class Main {

    public static void main(String[] args) {
        NotifySubject notifySubject = new NotifySubject();
        notifySubject.register(new SendMsgObserver());
        notifySubject.register(new CallObserver());
        notifySubject.notifyObserver("今天不上班,休假一天。");
    }
}
相关推荐
明洞日记8 小时前
【设计模式手册014】解释器模式 - 语言解释的优雅实现
java·设计模式·解释器模式
ZHE|张恒8 小时前
设计模式(十六)迭代器模式 — 统一访问集合元素的方式,不暴露内部结构
设计模式·迭代器模式
未秃头的程序猿11 小时前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
雨中飘荡的记忆12 小时前
深入理解设计模式之单例模式
java·设计模式
8***293114 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你1 天前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing1 天前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白1 天前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科1 天前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记1 天前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式