设计模式选型咨询:单例类A内部类协作场景下的模块解耦方案
解决方案:观察者模式 + 依赖注入
核心思路
你的场景核心是状态变化的双向联动:管理类C/D/E/F会更新状态类B,而B的状态变更又需要触发这些管理类的对应操作。用观察者模式可以完美解决这种「一对多」的依赖耦合,再配合依赖注入进一步降低模块间的硬关联。
具体实现步骤
- 定义观察者接口:创建一个
StateChangeListener接口,声明onStateChanged(StateB newState)方法,让C、D、E、F都实现这个接口,各自在方法里编写响应状态变化的逻辑。 - 改造状态类B:
- 新增注册/移除观察者的方法:
registerObserver(StateChangeListener)、removeObserver(StateChangeListener),内部维护一个观察者列表。 - 统一状态更新入口:不管是管理类触发的状态修改,还是B自身的状态更新,都通过B内部的方法完成(比如
updateState(State newState)),状态确认变更后,调用notifyObservers()遍历列表,通知所有观察者执行onStateChanged。
- 新增注册/移除观察者的方法:
- 解耦管理类与B的依赖:
- 不要让C/D/E/F直接持有B的实例,而是通过单例A把B注入到这些管理类中;或者让管理类只生成状态变更请求,调用B的
updateState方法,由B自己处理状态更新和通知逻辑。
- 不要让C/D/E/F直接持有B的实例,而是通过单例A把B注入到这些管理类中;或者让管理类只生成状态变更请求,调用B的
- 单例类A的职责:作为初始化容器,负责创建B和所有管理类实例,把管理类注册到B的观察者列表,同时将B注入给需要的管理类。
避坑提示
要注意避免循环调用:如果管理类调用B更新状态,B又通知管理类触发操作,可能形成循环。可以在B的updateState里加个判断——只有当新状态和旧状态确实不同时,才触发通知;或者把管理类的操作拆成「发起状态变更」和「响应状态变更」两个独立逻辑,避免互相触发。
为什么不选其他模式?
- 状态模式:核心是让B根据自身状态切换内部行为,不适合处理B与多个外部类的联动场景。
- 中介者模式:适合多类之间复杂交互的协调,但你的场景核心是状态变更通知,观察者模式更轻量、直接。
内容的提问来源于stack exchange,提问作者Pigeon
相关产品推荐
相关产品推荐

