中介者模式的定义:
中介就是游走于买方和卖方之间的纽带。卖方和买方通过中介来联系,省去了中间的沟通成本,比如房屋中介,卖方要面对多个买方,希望房子卖个不错的价格,而买方也要需要面对多个卖方,房比三家才能找到自己满意和价格适中的房子。如果此一来卖方和买方直接沟通,那沟通成本简直难以想象。而在设计模式中也一种类似中介的模式就是中介者模式。
中介者模式也称调度者模式,定义为用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式的实现方式:
再拿买房和卖方的举例来说,如果卖方和买方直接沟通的话,每个买房和卖方都可以互相联系,于是就形成了一个网状结构,如果更多的卖方和买方参与进来,那么画面可想而知。
这是时人就发现了商机。可以收集卖方的房子信息和买方的需求,这样一来,卖方和买方想要做房屋交易就可以来找我,先挑选满意的房子,然后再进一步进行交易。这样一来无论时卖方和买方都能节省不少沟通成本和时间成本。于是中介模式正式出现。
如此一来拓扑关系变得的简单明了,每个卖方和买方都是通过中介进行联系,耦合度降低。那程序该如何设计,首先需要一个中介 Mediator,卖方seller和买方buyer,类图关系如下:
代码实现:
package com.mediator;
/**
* 中介者模式
* 抽象中介类
*/
public abstract class Mediator {
//买方
protected BuyerCustomer buyerCustomer;
//卖方
protected SellerCustomer sellerCustomer;
//提供房子的信息
public abstract void getInfo();
//提供想要买房子的信息
public abstract void pushInfo();
//get/set注入
public BuyerCustomer getBuyerCustomer() {
return buyerCustomer;
}
public void setBuyerCustomer(BuyerCustomer buyerCustomer) {
this.buyerCustomer = buyerCustomer;
}
public SellerCustomer getSellerCustomer() {
return sellerCustomer;
}
public void setSellerCustomer(SellerCustomer sellerCustomer) {
this.sellerCustomer = sellerCustomer;
}
}
/**
* 中介模式
* 房屋中介
*/
public class ConcreteMediator extends Mediator{
@Override
public void getInfo() {
System.out.println("买房获得高大上的房子的信息");
}
@Override
public void pushInfo() {
System.out.println("卖方得到想买高大上房子的客户");
}
}
/**
* 中介模式
* 抽象顾客类
*/
public abstract class Customer {
protected Mediator mediator;
public Customer(Mediator mediator){
this.mediator= mediator;
}
}
package com.mediator;
/**
* 中介者模式
* 卖方客户
*/
public class BuyerCustomer extends Customer{
//传递给中介
public BuyerCustomer(Mediator mediator) {
super(mediator);
}
//提供房子的信息
public void gatheringInfo(){
System.out.println("想买高大上的房子");
}
//获取到想买房子的客户
public void getSeller(){
System.out.println("买方从中介那里得知:客户");
super.mediator.getInfo();
}
}
package com.mediator;
/**
* 中介者模式
* 买方客户
*/
public class BuyerCustomer extends Customer{
//传递给中介
public BuyerCustomer(Mediator mediator) {
super(mediator);
}
//提供房子的信息
public void gatheringInfo(){
System.out.println("想买高大上的房子");
}
//获取到想买房子的客户
public void getSeller(){
System.out.println("买方从中介那里得知:客户");
super.mediator.getInfo();
}
}
package com.mediator;
/**
* 中介模式
* 测试类
*/
public class Test {
public static void main(String[] args) {
//中介
Mediator mediator = new ConcreteMediator();
//卖方客户
SellerCustomer sellerCustomer = new SellerCustomer(mediator);
//买方
BuyerCustomer buyerCustomer = new BuyerCustomer(mediator);
//到中介注信息
mediator.setBuyerCustomer(buyerCustomer);
mediator.setSellerCustomer(sellerCustomer);
sellerCustomer.gatheringInfo();
buyerCustomer.gatheringInfo();
//获取交易信息
sellerCustomer.getBuyer();
buyerCustomer.getSeller();
}
}
//测试结果
想卖高大上的房子
想买高大上的房子
卖方从中介那里得知:客户
想买高大上的房子
买方从中介那里得知:客户
想卖高大上的房子
从代码实现中可以看出,无论是卖方还是买方只需要和中介建立联系就可以完成各自的需求。 卖方在中介注册卖房子的信息,而买方同样要在中介注册要买房的信息,当卖方需要获取买方信息时通过中介就可以获取,买方也是同样的道理。
中介者模式总结:
- 优势:解耦,中介者模式最突出的优点就是解耦合,简单化类与类之间的调用关系,将原来的一对多或者多对多,变成一对一的关系。
- 劣势:同样,因为这种解耦方式的存在,中介者的类会越来越庞大,因为中介者要兼容需要解耦的类的所有方法,意味着解耦类的变动,中介者也有可能会随之变动,逻辑处理会越来越复杂。
- 适用场景:中介者模式更像是成立一个调度中心,所有的需求都发送到中介者,而所有指令也是由中介者发布。strust的Controller的就是一个很好的例子,将Model和View隔离开,减少了业务和视图的依赖。实际开发中,目前还没有使用到这种场景,中介者模式优势明显,但是劣势也很突出,使用不慎的后果会带来后期维护的种种问题。