本文介绍如何在不修改现有 aevent 和 bevent 类的前提下,通过观察者模式实现统一事件处理逻辑,提供可复用、松耦合的泛型事件监听机制。
在实际开发中,我们常遇到已有类结构固定、但需新增统一行为(如事件聚合、日志记录、状态同步)的场景。此时若无法修改原始类(如 AEvent、BEvent),直接继承或重写方法不可行,而“硬
编码
”重复逻辑又违背开闭原则。观察者模式(Observer Pattern)正是解决此类问题的理想选择——它通过引入中介者(Observer)解耦事件源与响应逻辑,实现
零侵入、高扩展
的监听机制。
核心思路是:将 AEvent 和 BEvent 视为独立的被观察者(Subject),由一个统一的 EventObserver 负责接收通知并协调处理。关键在于
不改动原有类定义,仅通过委托(delegation)注入回调能力
。以下是推荐实现:
React Native For Android 源码编译 中文WORD版
本文档主要讲述的是React Native For Android 源码编译;希望对大家会有帮助;感兴趣的朋友可以过来看看
下载
✅ 推荐实现(最小侵入 + 类型安全)
?️ 改造 AEvent / BEvent(仅添加委托方法,不修改业务逻辑)
? 使用示例
⚠️ 注意事项与进阶建议
避免强耦合
:EventObserver 不应持有 AEvent/BEvent 实例引用,仅通过回调通信;
线程安全
:若事件在多线程环境触发,notifyEventCreated() 应加锁或使用 CopyOnWriteArrayList;
生命周期管理
:建议增加 removeListener() 方法防止内存泄漏;
替代方案对比
:
策略模式
:适用于行为差异大、需运行时切换,但需改造调用方;
访问者模式
:适合复杂对象结构遍历,此处过度设计;
事件总线(如 EventBus)
:适合大型系统,但引入第三方依赖,轻量场景不必要。
综上,观察者模式以极小改造成本实现了关注点分离——原始类专注自身职责,观察者专注聚合响应。这不仅是技术方案,更是面向演进系统的设计哲学:
让变化发生于可插拔的组件之间,而非固化的类内部。
// 1. 定义通用事件监听器接口(可选,提升可维护性)
interface EventListener {
void onEventCreated(T event);
}
// 2. 统一观察者:支持多类型事件聚合与协同处理
class EventObserver {
private final List> listeners = new ArrayList<>();
// 注册任意类型事件处理器(泛型擦除下安全使用)
public void addListener(EventListener listener) {
listeners.add(listener);
}
// 对外暴露统一触发入口(由各事件类调用)
public void notifyEventCreated(Object event) {
listeners.forEach(listener -> {
// 运行时类型检查,确保安全调用
if (listener instanceof EventListener) {
try {
Method method = listener.getClass()
.getMethod("onEventCreated", event.getClass());
method.invoke(listener, event);
} catch (Exception ignored) {}
}
});
}
} class AEvent {
private EventObserver observer;
// 仅新增此方法,不破坏原有 API
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public void onAEventCreate(A event) {
// 原有业务逻辑保持不变
System.out.println("Handling A event: " + event);
// 通知观察者(统一入口)
if (observer != null) {
observer.notifyEventCreated(event);
}
}
}
class BEvent {
private EventObserver observer;
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public void onBEventCreate(B event) {
System.out.println("Handling B event: " + event);
if (observer != null) {
observer.notifyEventCreated(event);
}
}
}public class UsageExample {
public static void main(String[] args) {
EventObserver observer = new EventObserver();
// 注册统一处理器(支持不同事件类型)
observer.addListener((EventListener) a ->
System.out.println("✅ Unified handler for A: " + a));
observer.addListener((EventListener) b ->
System.out.println("✅ Unified handler for B: " + b));
AEvent aEvent = new AEvent();
BEvent bEvent = new BEvent();
aEvent.setObserver(observer);
bEvent.setObserver(observer);
aEvent.onAEventCreate(new A()); // → 触发 A 处理器
bEvent.onBEventCreate(new B()); // → 触发 B 处理器
}
}