[设计模式] 行为型:中介者模式(Mediator Pattern)

什么是中介者模式

中介者模式也是顾名思义,我们需要完成某件事情,但是因为不够专业,或者不想亲自实践,就可以找个中介帮我们完成事情。

中介者模式存在的意义和用途是什么呢?

思考一个场景,房屋租赁,房东需要出租房子,租客需要承租房子。

没有中介的情况下,房东和租客需要直接沟通洽谈,于是,一个房东需要面对很多租客,一个租客也要面对很多房东,这是个多对多的关系。

现实中如果真这样,房东和租客都会比较累,需要照顾的方面太多。多对多的业务场景,映射到程序代码里面,就会导致模块或实体间的关系增强,形成复杂的依赖耦合。

高类聚低耦合,是程序优良设计的一贯准则,所以,我们需要降低房东和租客之间的复杂依赖关系,方法之一就是引入中介完成交易。

有中介以后,房东与租客不再直接联系,都通过中介来完成出租和承租,房东只和中介联系,租客也只和中介联系。原先的多对多关系,就转换成一对一关系,耦合度自然也就降低了很多。

这就是中介者模式的应用场景,是一种解耦多对多网状关系的设计模式。

设计与实现

中介者类似于一个中间通道,自身并没有多少独立逻辑,主要都是帮助对接双方进行业务转换的业务逻辑。

代码实现上,没有什么精巧可言,还是以房东和租客为例,大致如下:

// 房东、租客 抽象类
public abstract class Colleague {
    protected Mediator mediator;

    public void setMedium(Mediator mediator) {
        this.mediator = mediator;
    }
}

// 房东
public class Landlord extends Colleague {
    private String condition = "1000块钱的房子";

    public String getCondition() {
        return condition;
    }

    // 出租房子,让中介帮忙寻找租客
    public void findRenter() {
        Renter renter = super.mediator.findRenter(condition);
        System.out.println("找到合适的租客:renter = " + renter);
    }
}

// 租客
public class Renter extends Colleague {
    private String condition = "1000块钱的房子";

    public String getCondition() {
        return condition;
    }

    // 承租房子,让中介帮忙寻找房东
    public void findLandlord() {
        Landlord landlord = super.mediator.findLandlord(condition);
        System.out.println("找到合适的房东:landlord = " + landlord);
    }
}

// 中介
public class Mediator {
    private List<Landlord> landlords = new ArrayList<>(); // 房东
    private List<Renter> renters = new ArrayList<>(); // 租客

    // 注册 房东、租客
    public void register(Colleague colleague) {
        if (colleague instanceof Landlord) {
            landlords.add((Landlord) colleague);
            colleague.setMedium(this);
        }
        if (colleague instanceof Renter) {
            renters.add((Renter) colleague);
            colleague.setMedium(this);
        }
    }

    // 帮房东寻找符合条件的租客
    public Renter findRenter(String data) {
        for (Renter renter : renters) {
            String condition = renter.getCondition();
            if (data.equals(condition)) return renter;
        }
        return null;
    }

    // 帮租客寻找符合条件的房东
    public Landlord findLandlord(String data) {
        for (Landlord landlord : landlords) {
            String condition = landlord.getCondition();
            if (data.equals(condition)) return landlord;
        }
        return null;
    }
}

// 测试方法
public static void main(String[] args) {
    Landlord landlord = new Landlord();
    Renter renter = new Renter();
    Mediator mediator = new Mediator();
    mediator.register(landlord);
    mediator.register(renter);
    landlord.findRenter();
    renter.findLandlord();
}

中介者模式最强的作用就是降低模块间的复杂依赖关系,但是通常来讲,这也会带来一定的副作用:依赖关系越复杂,中介者膨胀的越快。

这个模式理解应用都很简单,因此也很容易被强行误用。在面向对象的设计中,对象之间必然会有一定的依赖关系,一对多的关系也很常见,在关系不复杂且可控的时候,没必要按照严格的理论引入中介者模式,存在即是合理!

引入中介者模式也未必就能有效降低程序耦合性,因为引入中介者本身的行为就是又增加了一个依赖因素!使用不当反而会导致逻辑更加的复杂。

选用中介者模式一定要“量力而行”!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值