OOP正确实现:has-a关联场景下通知责任的归属判断
面向对象设计场景下通知责任归属方案选择
结论
优先选择由Product承担通知责任,对应实现Product#notify(Event),完全符合面向对象设计的核心原则。
核心理由
- 符合信息专家原则:该原则要求将职责分配给持有完成职责所需全部信息的类。
Product作为Event集合的持有者,掌握所有事件关联的业务上下文、以及需要接收通知的下游依赖(如价格同步模块、促销计算模块等)的绑定关系,天然具备执行通知动作的全部信息基础。 - 符合单一职责原则:
Event的核心定位是领域事件的载体,仅需要承载事件本身的元数据(如变动类型、变动值、触发时间)即可,不需要感知所属Product的外部依赖逻辑。如果把通知职责放到Event中,会让Event同时承担「数据载体」和「通知执行」两个不相关的职责,后续修改通知规则、新增事件类型时耦合度会非常高。 - 规避逻辑循环问题:不需要在
Product内部调用时出现this.events[i].notify(this)这种别扭的循环传参写法,代码可读性和可维护性更高。
额外优势
后续如果需要新增事件过滤、规则判断逻辑(比如低优先级事件不需要推送、特定状态的Product不发通知),直接在Product#notify方法中扩展即可,不需要修改所有Event的实现,扩展性更强。
内容的提问来源于stack exchange,提问作者mlntdrv
相关产品推荐
相关产品推荐

