什么是观察者模式?一般用在什么场景

什么是观察者模式?一般用在什么场景?

🎭 模式概述

观察者模式(Observer Pattern)行为型设计模式,用于定义对象之间的一对多依赖关系,当被观察的对象(Subject状态发生变化时,所有依赖它的对象(Observer)都会收到通知,并自动更新。

该模式类似于 “发布-订阅” 机制,常用于需要通知多个对象状态变化的场景,如 事件监听、消息通知、数据绑定 等。

🏗 模式结构

观察者模式通常包括以下几个核心组件:

  • 🔵 主题(Subject):被观察的对象,维护观察者列表,并提供 添加/删除观察者的方法
  • 🟢 观察者(Observer):订阅主题的对象,当主题状态变化时,观察者会收到通知。
  • 🟡 具体主题(Concrete Subject):实现 Subject,当自身状态改变时通知所有观察者。
  • 🟠 具体观察者(Concrete Observer):实现 Observer,收到通知后执行相应的更新操作。

💻 示例代码(Java 版)

🔹 需求:

模拟一个微信公众号,当公众号发布新文章时,所有订阅者都会收到通知。

👨‍💻 代码实现
import java.util.ArrayList;
import java.util.List;

// 🔵 主题(Subject)接口
interface Subject {
    void attach(Observer observer); // 添加观察者
    void detach(Observer observer); // 移除观察者
    void notifyObservers(); // 通知所有观察者
}

// 🟡 具体主题(Concrete Subject)—— 公众号
class WeChatOfficialAccount implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String article; // 最新文章内容

    public void publishArticle(String article) {
        this.article = article;
        System.out.println("📢 公众号发布新文章:" + article);
        notifyObservers(); // 文章发布后,通知所有观察者
    }

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(article); // 通知所有订阅者
        }
    }
}

// 🟢 观察者(Observer)接口
interface Observer {
    void update(String article);
}

// 🟠 具体观察者(Concrete Observer)—— 订阅者
class Subscriber implements Observer {
    private String name;

    public Subscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(String article) {
        System.out.println("📩 " + name + " 收到新文章通知:" + article);
    }
}

// 🎯 测试
public class ObserverPatternExample {
    public static void main(String[] args) {
        WeChatOfficialAccount account = new WeChatOfficialAccount();

        Observer user1 = new Subscriber("Alice");
        Observer user2 = new Subscriber("Bob");

        account.attach(user1);
        account.attach(user2);

        account.publishArticle("《设计模式详解:观察者模式》"); // 发布新文章

        account.detach(user1); // Alice 取消订阅

        account.publishArticle("《Java 并发编程实战》"); // 再次发布文章
    }
}

📌 运行结果

复制编辑📢 公众号发布新文章:《设计模式详解:观察者模式》
📩 Alice 收到新文章通知:《设计模式详解:观察者模式》
📩 Bob 收到新文章通知:《设计模式详解:观察者模式》

📢 公众号发布新文章:《Java 并发编程实战》
📩 Bob 收到新文章通知:《Java 并发编程实战》

👀 说明:

  • 公众号 发布新文章 时,所有订阅者都会收到通知。
  • Alice 取消订阅后,就不会收到后续文章的通知了。

🎯 应用场景

GUI 事件监听(Java Swing、Android、Vue.js 等)
  • 按钮点击、输入框内容变化等场景,注册监听器,事件触发时通知所有监听器。
消息推送/订阅系统
  • 公众号推送、社交媒体通知、消息队列(如 Kafka、Redis Pub/Sub)。
数据绑定(数据驱动 UI)
  • Vue.js、React 的双向数据绑定,数据变化时 UI 自动更新。
MVC 设计模式
  • 视图(View)观察模型(Model),当数据变化时,视图会自动更新。
分布式系统、缓存更新
  • 微服务架构中,一个服务数据变化后,通知其他依赖它的服务更新缓存或同步数据。

🏆 总结

✨ 观察者模式是一种发布-订阅模式,适用于一对多的通知场景。
✨ 它解耦了“事件的发生者”与“事件的接收者”,提高了代码的扩展性和灵活性。
✨ 常用于 GUI 事件监听、消息推送、数据同步等场景。
🚀 如果你的系统需要多个对象在状态变化时自动同步,观察者模式就是最佳选择!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值