问题描述
在一个系统中存在多个实体对象,这些实体对象之间存在交互关系。例如:实体A状态更新会导致实体B自动得到更新,并依据实体A的变化采取相应的动作。把实体对象之间的交互关心设计到每个实体对象中,会引入实体类之间的依赖关系,从而限制了实体类的可重用性。中介者模式引入一个单独的中介者对象来管理实体对象之间的交互关系。每个实体对象只和中介者对象交互,这保证了实体对象之间的独立性。
中介者模式
如图所示,中介者对象定义了StatusChanged()方法用于Colleague对象发布自己状态更新消息。ConcreteMediator对象了解所有它管理的Colleague对象,更知道这些Colleague对象之间的交互关系。例如ConcreteColleagueA对象逻辑调用StatusChanged()方法后,ConcreteMediator对象会调用ConcreteColleagueB对象的Adjust()方法来通知ConcreteColleagueB对象。由此可见,ConcreteMediator对象封装了ConcreteColleagueA & ConcreteColleagueB之间的交互关系,让这两个对象保持独立。这种方法提高了类ConcreteColleagueA & ConcreteColleagueB的可重用性,也让ConcreteMediator对象变得难于重用。中介者模式解除了对象间的交互依赖,也创造一个可能复杂的,不可重用的中介者对象。
讨论
中介者模式可以采用观察者模式来实现:把Colleague对象当做实体对象,Mediator对象当做观察者对象;一旦实体对象有任何状态更新,实体对象自动更新观察者对象。观察者对象再集中处理多个实体对象之间的交互关系。