中介者模式
模式定义
也译为“调停者模式”,该模式用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显式的相互引用,从而使其松散耦合,而且可以独立的改变它们之间的交互。在GOF95中中介者模式被分类为行为型模式。
模式结构与说明
- Mediator:中介者接口,在里面定义各同事之间交互需要的方法。可以是公共的通信方法,比如changed,大家都用;也可以是小范围的交互方法
- ConcreteMediator:具体的中介者实现,持有所有同事的引用,并协调各同事之间的交互关系
- Colleague:同事抽象类,主要负责约束同事的类型,不实现同事的公共功能,比如每个同事都应该知道中介者对象(getMediator)
- ConcreteColleague:具体同事类,实现自己的业务,它们直接绝不存在任何依赖关系。它们如果需要与其它同事通信,就持有中介者的引用
中介者模式很好的体现了迪米特法则,它可以彻底解耦网状的对象关系。
中介者模式的优点:
- 通过将对象彼此解耦,可以增加对象的复用度
- 通过将控制逻辑集中,可以简化系统维护
- 可以让对象之间传递的消息变得简单而且大幅减少
- 将多对多关系改变为一对多
中介者模式的缺点:
- 如果设计不当,中介者对象本身会变得过于复杂
中介者模式的适用场景:
- 如果一组对象之间的通信方式过于复杂,导致结构混乱的互相依赖
- 用来协调相关的GUI组件
经典应用
Java反射中的中介者模式
1 2 3 4 |
public class Method{ public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException; } |
Method类实现了一种变形的中介者模式,Method相当于Mediator角色,调用invoke()的Client代码相当于Colleague角色,invoke()的obj参数也相当于Colleague角色。虽然Client持有了需要交互的Colleague的引用,但是它不需要知道Colleague类型的任何信息。
模式演变
- 退化:取消同事的公共抽象类。如果不同的同事类没有什么公共功能,仅仅一个getMediator()往往不值得让它们拥有公共父类
- 退化:具体中介者作为单例。如果只需要一个中介者对,那么可以用单例实现
- 退化:取消中介者接口。如果不可能有切换中介者的需求,可以取消此接口
- 与外观模式的比较:两者都很好的提现迪米特法则。但是外观模式对系统内部进行封装,对Client提供单向的接口;而中介者模式则来协调系统内部的多个组件,并且通信是双向的
Leave a Reply