1. 观察者模式核心思想解析
观察者模式本质上是一种事件驱动的编程范式,它解决了对象间一对多的依赖关系问题。在直播间送礼这个典型案例中,我们可以清晰地看到这种模式的运作机制。
核心架构由三部分组成:
- 被观察者(Subject):维护观察者列表并提供注册/注销方法
- 观察者接口(Observer):定义统一的更新接口
- 具体观察者(ConcreteObserver):实现各自的具体业务逻辑
这种设计带来的直接好处是:当送礼事件发生时,GiftService只需要发出通知,完全不需要知道有哪些系统需要响应这个事件。各个子系统通过实现统一的Observer接口,自主决定如何响应事件。
关键设计原则:面向接口编程而非实现编程。GiftService只依赖GiftObserver接口,不依赖任何具体实现类。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 直播间场景的完整实现方案
2.1 基础实现代码优化
原始代码已经展示了基本实现,我们可以进一步优化:
java复制// 增强版GiftSubject
public class GiftSubject {
private final List<GiftObserver> observers = new CopyOnWriteArrayList<>();
// 线程安全的注册方法
public void attach(GiftObserver observer) {
Objects.requireNonNull(observer);
observers.add(observer);
}
// 带优先级的通知方法
public void notifyObservers(User user, Gift gift) {
observers.sort(Comparator.comparingInt(GiftObserver::getPriority));
observers.forEach(observer -> {
try {
observer.onGiftSent(user, gift);
} catch (Exception e) {
log.error("Observer处理异常", e);
}
});
}
}
主要改进点:
- 使用CopyOnWriteArrayList实现线程安全
- 增加空指针检查
- 支持观察者优先级
- 添加异常处理机制
2.2 观察者实现示例
java复制// 带优先级的观察者接口
public interface GiftObserver {
void onGiftSent(User user, Gift gift);
default int getPriority() { return 0; }
}
