1.中介者模式简介
中介者模式(Mediator Pattern) 也称为调解者模式或调停者模式,Mediator本身就有调停者和调节者的意思。
面向对象的设计鼓励把行为分散到不同对象中。这种分散可能导致对象之间的相互关联。增加的关联使得对象很难或不能在不依赖其他对象的情况下工作。应用程序的整体行为可能难以进行任何重大修改,因为行为分布于许多对象。于是结果可能是创建越来越多的子类,以支持应用程序的任何新行为。中介者模式用于定义一个集中的场所,对象间的交互可以在一个中介者对象中处理。其他对象不必彼此交互,因此减少了它们之间的依存关系。-《Objective-C编程之道 iOS设计模式解析》
2.中介者模式定义
《Android源码设计模式解析与实战》中的定义:
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以降低耦合(松散耦合)。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。
《Objective-C编程之道 iOS设计模式解析》中的定义:
用一个对象了来封装一系列对象的交互方式。中介者使各种对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
3.中介者模式的使用场景
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可以采用中介者模式来解决紧耦合问题。该模式将对象之间的多对多关系变成一对多的关系,中介者对象将系统从网状结构变成以调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。
对象间的交互虽定义明确然而非常复杂,导致一组对象彼此相互依赖而且难以理解;
因为对象引用了许多其他对象并与其通讯,导致对象难以复用;
想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类。
4.中介者模式的UML 图
(1)AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
(2)ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
(3)Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
(4)ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
5.角色划分
角色一:Mediator(抽象中介者)
角色二:ConcreteMediator(具体中介者)
角色三:Colleague(抽象同事 )
角色四:ConcreteColleague(具体同事)
注意:中介者和同事是可以相互持有的,注意引用的时候,需要一方弱引用。
6.Demo 实践
6.1 无抽象角色的中介者模式
为了方便理解,先举个无抽象角色,咱们常用的MVC 作为例子。
MVC 本身并不是最基本的设计模式,他包含了若干更加基本的设计模式:
组合模式(Composite)、命令模式(Command)、中介者模式(Mediator)、策略模式(Strategy)和观察者模式(Observer)。
咱们着重说下中介者模式:
控制器对象起着中间人的作用,而这个中间人则采用了中介者模式,他构成了在模型和视图对象之间传递数据的双向通道。其中,模型和视图之间是不会引用对方,就是说在V 中不会看见M的任何信息,M中也不会看到V 的任何信息。M和V 之间是互相不认识的。明确个问题,咱们在实际开发过程中,经常将Model(数据源)传入到Cell中进行刷新页面数据,这样的话Cell 就和Model 绑定了,所以违反了MVC准则,也违反了中介者模式。如果想要严格遵循MVC ,那么你应该从C 中配置Cell,而不是将Model 传递到Cell 中,但是这样会增大Controller。(至于如何优化,咱们后期再谈)。上面的话理解了,Demo 的理解就简单了。
Demo对应得角色划分(未涉及到抽象角色):
C:ConcreteMediator
M:ConcreteColleague1
V: ConcreteColleague2
Demo地址:https://github.com/zhiyoukaifa/MVC-Mediator
6.2 含有抽象角色的中介者模式
(1)AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
(2)ConcreteMediator(MediatorLJ):具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
(3)Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
(4)ConcreteColleague1(Buyer)、ConcreteColleague2(Seller):具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
看Demo时候一定要对用上方的UML图来看!否则容易走火入魔。
参考flyflyho的Demo:https://github.com/flyho-iOS/Mediator-pattern-
参考书籍:
《Objective-C编程之道 iOS设计模式解析》
《Android源码设计模式解析与实战》
参考链接:
https://blog.csdn.net/u012124438/article/details/70474166
http://www.cocoachina.com/ios/20170914/20567.html
https://www.jianshu.com/p/ec398c2a13bc