中介者模式:用一个中介对象来封装一系列的对象交互。使得各对象不用显式的相互引用,从而使其耦合松散,而且可以独立改变它们之间的交互。
中介者模式
中介者模式 Mediator[ˈmidiˌetɚ] Pattern
:又称为调停者模式,将多对多的相互作用转换为一对多的相互作用,减少对象间的复杂引用关系,使得成为一个松耦合系统。
类图结构
结构解析
Mediator
抽象类,定义中转调用时的方法。ConcreteMediator
实现类,实现中转调用的逻辑,持有所有需要被中转类的引用。Colleague
抽象类,仅仅持有一个抽象Mediator
对象的引用,不定义抽象方法。ConcreteColleague1/ConcreteColleague2
实现类,定义需要中转的方法。两者并不需要有公共父类,如果需要也仅仅是引用相同的Mediator
对象。
客户端会将 ConcreteColleague1, ConcreteColleague2, ConcreteMediator
三个对象连接起来,当 ConcreteColleague1
需要调用 ConcreteColleague2
的方法时,并不是直接调用,而是通过 ConcreteMediator.mediate
来中转调用。Colleague
这个角色并不一定需要,它的作用仅仅是将实现类和 Mediator
关联起来,持有 Mediator
的引用。所以实际使用中 ConcreteColleague1, ConcreteColleague2
也并不是拥有相同父类,只要将他们通过 Mediator
连接起来就行。
示例
1 | // 1. Mediator |
中介者模式中需要中转调用的两个类,并不一定需要有相同的父类。父类 Colleague
更多的是确保每个子类必须持有 Mediator
的引用。如上示例中 ConcreteColleague1.action1
对 ConcreteColleague2.action2
的调用,就是通过 ConcreteMediator.mediate
来实现的。
总结
- 中介者模式与迪米特原则
迪米特原则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发调用。该原则指一个对象应该对于其他对象有最少的了解,有效的降低类之间的耦合。中介者模式是迪米特原则的典型应用。 - 类比
中介者模式,类似电脑的主板协调各个器件工作;系统的各个总线协调驱动程序运行;中介者模式能够将错综复杂的网状图优化成结构清晰的星型图,其中心就是中介者;MVC
架构中的Control
就是典型的中介者。
所有的UI
交互系统,如C#/Form, Android Activity
中的UI
交互界面,都承担了中介者的角色,它会将Button, TextView, EditText
等连接起来,这些控件的交互都是通过窗体来中转,响应并显示的。
参考文档
- 大话设计模式
Android
源码设计模式解析与实战- 中介者模式