代码段学习设计模式 -- 中介者模式

一、定义

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

从下面的示意图我们可以看到中介者模式带给我们的改变:

中介者模式

通过上图,我们不难想象在具体业务开发中的场景,多个对象由于业务的原因互相调用,类与类之间耦合在一起,可谓是牵一发而动全身,比如:对象1 有一个简单的,其他各类根据具体业务也要随之更改,这样就造成后期代码维护极其困难。而如果引入中介者模式,我们可以直观观察到类与类之间的耦合关系变弱了,各个 BO(Business Object,业务对象) 间的互相调用变成各个 BO 与中介者类的调用,这样大大减弱了各个 BO 间的耦合关系。

二、UML 类图表示

UML

Mediator :抽象中介者
ConcreMediator : 具体中介者
BOn : 业务对象

三、具体业务代码

具体根据 UML 类图中我们设计具体业务操作

抽象中介者

public abstract class Mediator {
    protected BussinessObjectOne bussinessObjectOne;
    protected BussinessObjectTwo bussinessObjectTwo;

    public void setBussinessObjectOne(BussinessObjectOne bussinessObjectOne) {
        this.bussinessObjectOne = bussinessObjectOne;
    }

    public void setBussinessObjectTwo(BussinessObjectTwo bussinessObjectTwo) {
        this.bussinessObjectTwo = bussinessObjectTwo;
    }

    public abstract void metod1();

    public abstract void metod2();
}

多个 BO 通过 关联关系 与抽象中介者产生调用关系。

具体中介者

public class ConcreteMediator extends Mediator {
    @Override
    public void metod1() {
        super.bussinessObjectOne.selfMethod1();
    }

    @Override
    public void metod2() {
        super.bussinessObjectTwo.selfMethod2();
    }
}

真正的业务逻辑全部集中在这里进行处理,实现了 BO 之间的 互相调用 转换为各个 BO中介者 之间的 单一调用 关系,实现了解耦合的目的。

抽象业务类

public abstract class BussinessObject {
    protected Mediator mediator;

    public BussinessObject(Mediator mediator) {
        this.mediator = mediator;
    }
}

该类的目的为将中介者传入至业务类进行调用。

具体业务类

public class BussinessObjectOne extends BussinessObject {

    public BussinessObjectOne(Mediator mediator) {
        super(mediator);
    }

    /**
     * 自发行为方法
     */
    public void selfMethod1() {
    }

    /**
     * 依赖方法(必须依赖中介者才可以实现)
     */
    public void depMethod1() {
        super.mediator.metod1();
    }
}


public class BussinessObjectTwo extends BussinessObject {
    public BussinessObjectTwo(Mediator mediator) {
        super(mediator);
    }

    /**
     * 自发行为方法
     */
    public void selfMethod2() {
    }

    /**
     * 依赖方法(必须依赖中介者才可以实现)
     */
    public void depMethod2() {
        super.mediator.metod2();
    }
}

业务场景类

public class Client {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();
        BussinessObjectOne bussinessObjectOne = new BussinessObjectOne(mediator);
        BussinessObjectTwo bussinessObjectTwo = new BussinessObjectTwo(mediator);
        bussinessObjectOne.depMethod1();
        bussinessObjectTwo.depMethod2();
    }
}

至此,中介者模式的抽象代码如上所示,其实贴这些代码也没什么具体的用处,还是要进行实践,就是照着敲一遍也会有不一样的理解。

四、中介者模式分析

就如中介者模式的定义:用一个中介对象来封装一系列的对象交互,很明显我们解耦 BO 间的关系,将一系列交互封装到中介者中,这是该模式优点,同时也是它的缺点。随着 BO 的数量、交互的增多,中介者将变的十分臃肿。

后续自己还是会深度学习中介者模式以及其变体,实现更加优化的代码。


本文代码资源:PatternUseThink

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值