什么是中介者模式
中介者模式也是顾名思义,我们需要完成某件事情,但是因为不够专业,或者不想亲自实践,就可以找个中介帮我们完成事情。
中介者模式存在的意义和用途是什么呢?
思考一个场景,房屋租赁,房东需要出租房子,租客需要承租房子。
没有中介的情况下,房东和租客需要直接沟通洽谈,于是,一个房东需要面对很多租客,一个租客也要面对很多房东,这是个多对多的关系。
现实中如果真这样,房东和租客都会比较累,需要照顾的方面太多。多对多的业务场景,映射到程序代码里面,就会导致模块或实体间的关系增强,形成复杂的依赖耦合。
高类聚低耦合,是程序优良设计的一贯准则,所以,我们需要降低房东和租客之间的复杂依赖关系,方法之一就是引入中介完成交易。
有中介以后,房东与租客不再直接联系,都通过中介来完成出租和承租,房东只和中介联系,租客也只和中介联系。原先的多对多关系,就转换成一对一关系,耦合度自然也就降低了很多。
这就是中介者模式的应用场景,是一种解耦多对多网状关系的设计模式。
设计与实现
中介者类似于一个中间通道,自身并没有多少独立逻辑,主要都是帮助对接双方进行业务转换的业务逻辑。
代码实现上,没有什么精巧可言,还是以房东和租客为例,大致如下:
// 房东、租客 抽象类
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();
}
中介者模式最强的作用就是降低模块间的复杂依赖关系,但是通常来讲,这也会带来一定的副作用:依赖关系越复杂,中介者膨胀的越快。
这个模式理解应用都很简单,因此也很容易被强行误用。在面向对象的设计中,对象之间必然会有一定的依赖关系,一对多的关系也很常见,在关系不复杂且可控的时候,没必要按照严格的理论引入中介者模式,存在即是合理!
引入中介者模式也未必就能有效降低程序耦合性,因为引入中介者本身的行为就是又增加了一个依赖因素!使用不当反而会导致逻辑更加的复杂。
选用中介者模式一定要“量力而行”!