Android设计模式详解之中介者模式

前言

中介者模式也称为调解者或调停者模式;

定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散耦合;当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。
中介者模式将多对多的相互作用转化为一对多的相互作用。
中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理;

使用场景:
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采用中介者模式来解决紧耦合的问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用;

UML类图:
中介者模式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来充当中介者协调这些管理器的状态改变;

总结

优点:对于错综复杂的类与类关系,可以使代码结构清晰,避免紧耦合问题;

缺点:类数量增加,对于不复杂的类关系,反而会使代码结构变得复杂;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值