观察者模式(Observer Pattern)是一种行为型设计模式,其核心思想是:
当一个对象的状态发生变化时,自动通知所有依赖它的对象,而无需关心这些对象的具体实现。
“一对多”的依赖关系:一个主题(Subject)变化,多个观察者(Observer)自动更新。
你不需要一直刷新公众号,只要“关注”了,它更新你就能收到。
| 角色 | 作用 |
|---|---|
| Subject(主题) | 维护观察者列表,提供注册、移除、通知方法 |
| Observer(观察者接口) | 定义更新接口 |
| ConcreteSubject | 具体主题,状态变化后通知观察者 |
| ConcreteObserver | 具体观察者,实现更新逻辑 |
public interface Observer {
void update(String message);
}
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
private void notifyObservers() {
for (Observer o : observers) {
o.update(state);
}
}
}
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到消息:" + message);
}
}
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
Observer o1 = new ConcreteObserver("观察者A");
Observer o2 = new ConcreteObserver("观察者B");
subject.attach(o1);
subject.attach(o2);
subject.setState("状态发生变化!");
}
}
✅ 解耦
✅ 符合开闭原则
✅ 支持广播通信
❌ 观察者过多时,通知可能影响性能
❌ 如果观察者之间有依赖,容易产生复杂关系
❌ 可能引起循环触发
✅ 事件监听机制(GUI、按钮点击)
✅ 消息订阅、发布系统
✅ 数据变化需要同步更新多个模块
✅ MVC 架构(Model → View)
| 观察者模式 | 发布-订阅模式 |
|---|---|
| 观察者直接依赖主题 | 通过中间“事件通道” |
| 通常同步 | 常异步 |
| 多用于面向对象 | 多用于消息系统 |
观察者模式就是:你关注我,我变了就自动告诉你。
如果你愿意,我也可以用 Spring 事件机制 / Vue 响应式 / 前端事件监听 的角度再给你讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。