前言
中介者模式也称为调解者或调停者模式;
定义:
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散耦合;当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。
中介者模式将多对多的相互作用转化为一对多的相互作用。
中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理;
使用场景:
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为
,可采用中介者模式来解决紧耦合的问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调停者为中心的星形结构
,达到降低系统的复杂性,提高可扩展性的作用;
UML类图:
Mediator:
抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现;ConcreteMediator:
具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接收消息,向具体同事对象发出命令;Colleague:
抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象
;ConcreteColleagueA、ConcreteColleagueB:
具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围内的行为,而不知道它在大范围内的目的;
模板代码
- 定义抽象中介者角色,
Mediator
/**
* 抽象中介者角色
*/
abstract class Mediator {
/**
* 同事A
*/
var colleagueA: ConcreteColleagueA? = null
/**
* 同事B
*/
var colleagueB: ConcreteColleagueB? = null
/**
* 抽象中介方法,交给具体的中介者实现
*/
abstract fun method()
}
- 定义抽象同事类角色,
Colleague
/**
* 抽象同事类
*/
abstract class Colleague(mediator: Mediator) {
/**
* 同事角色的具体行为,由具体的子类实现
*/
abstract fun action()
}
- 定义具体同事A,
ConcreteColleagueA
/**
* 具体同事A
*/
class ConcreteColleagueA(mediator: Mediator) : Colleague(mediator) {
override fun action() {
println("ColleagueA 将信息交给中介者处理...")
}
}
- 定义具体同事B,
ConcreteColleagueB
/**
* 具体同事B
*/
class ConcreteColleagueB(mediator: Mediator) : Colleague(mediator) {
override fun action() {
println("ColleagueB 将信息交给中介者处理...")
}
}
- 定义具体的中介者角色,
ConcreteMediator
/**
* 具体中介者角色,调用同事方法进行协调处理
*/
class ConcreteMediator : Mediator() {
override fun method() {
colleagueA?.action()
colleagueB?.action()
}
}
- 代码调用以及结果输出
object Test {
@JvmStatic
fun main(args: Array<String>) {
val concreteMediator = ConcreteMediator()
//定义同事A,同事B
val colleagueA = ConcreteColleagueA(concreteMediator)
val colleagueB = ConcreteColleagueB(concreteMediator)
concreteMediator.colleagueA = colleagueA
concreteMediator.colleagueB = colleagueB
concreteMediator.method()
}
}
ColleagueA 将信息交给中介者处理...
ColleagueB 将信息交给中介者处理...
Android源码中的中介者设计模式
-
Activity
,Activity自身就可以看成是一个中介者角色
,而界面中的各个View则可以看成是具体的同事
,"同事"之间协作交给Activity来完成; -
锁屏功能中介者:KeyguardViewMediator
,从名称我们也能大概知道是采用了中介者设计模式,我们简单看下代码;
public class KeyguardViewMediator extends SystemUI implements Dumpable,
StatusBarStateController.StateListener {
....
//定时任务manager
private AlarmManager mAlarmManager;
//音频manager
private AudioManager mAudioManager;
//通知栏manager
private StatusBarManager mStatusBarManager;
....
}
这些XXXManager就对应具体的同事类
,Android使用KeyguardViewMediator
来充当中介者协调这些管理器的状态改变;
总结
优点:
对于错综复杂的类与类关系,可以使代码结构清晰,避免紧耦合问题;
缺点:
类数量增加,对于不复杂的类关系,反而会使代码结构变得复杂;
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )