什么是观察者模式?一般用在什么场景?
🎭 模式概述
观察者模式(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 事件监听、消息推送、数据同步等场景。
🚀 如果你的系统需要多个对象在状态变化时自动同步,观察者模式就是最佳选择!