如何理解中介者模式
如何理解一个设计模式,首先需要了解他的应用场景,进而得出他的使用价值以及使用原因。我们从最容易理解的日常事务中举个中介者模式的栗子,对比加思考来理解中介者模式,包括何为中介者,为何需要中介者。
举个栗子看模式
eg: 举个栗子,我们搬家的时候,东西很多,不是提着个袋子就能把东西都装下,于是我们需要找车子。那么我们怎么办呢。以前搬家的时候,会去一些小区门口,一些路口找一些车,看看人家车子大小能不能装下自己的东西,还得问问人家是不是愿意帮忙,搬家甚是麻烦。之后货拉拉看到了这个商机,货拉拉负责去找这些愿意帮人搬家的车和司机,还统计车子大小,司机的服务质量等信息,于是,有人需要搬家的时候直接找货拉拉就可以,告诉货拉拉你需要多大的车,什么时间需要就可以了,货拉拉负责帮你联系司机和车,两全其美,岂不美哉。
通过这个例子可以看出,货拉拉(中介者)是搬家者和搬家车司机之间的一个纽带,他负责搬家者和搬家车司机之间的通信,而因为有了货拉拉这个中介者,搬家者和搬家车司机都可以轻松的达到自己的目的。这就是一个中介者的例子。
那么我们思考一下,作为一个中介者需要有什么资质和能力呢?
首先货拉拉(中介者)作为一个通信联络者,他需要知道搬家者和搬家车司机的联系方式,其次他需要帮搬家者做一些事情,比如搬家者之前需要找大小合适的车子,现在有了货拉拉后,货拉拉需要负责把车子大小告诉搬家者,然后帮搬家者实现搬家的需求。同时因为有了货拉拉,我们的搬家者需要联系货拉拉帮我们啊,司机需要货拉拉能找到自己,但同时自己也可以找到货拉拉,比如司机想拉货,但现在没活,他也可以主动告诉货拉拉自己的需求,同时我们搬家者也需要知道货拉拉的存在。
角色组成
综合考虑,我们可以将中介者模式的组成分为以下几个部分:
- 中介者(货拉拉)
- 需要中介者进行通信联系的多方实体(搬家者和搬家车司机)
成分分析
中介需要联系多方实体,他需要知道每个实体才能联系,所以,他的设计需要包含每个实体的实例作为其属性,他需要办实体做一些事,所以他需要有执行任务的方法。
而我们的多方实体也需要包含有中介者的实例,才能找到中介者,所以中介者需要作为多方实体的一个属性,同时定义自己需要做的事,让中介者代替我们完成。
如何设计中介者模式
知道了实体和中介者的成分后,我们接下来思考中介者模式的设计:
首先定义一个抽象中介者,因为按照不同功能可划分为不同中介(这句话的可以这么理解,货拉拉中介要做很多事,于是他按照功能区分了一下,比如负责找车的中介、负责统计车大小的中介等等)。
public abstract class AbstractMediator {
protected BanJiaEntity banjia;//搬家者
protected CarEntity car;//车
//构造函数
public AbstractMediator(){
banjia = new BanJiaEntity(this);
car = new CarEntity(this);
}
//中介者最重要的方法叫做事件方法,处理多个对象之间的关系
public abstract void execute(String str,Object...objects);
}
有了抽象中介后我们让货拉拉(中介者实例)继承抽象中介
public class Mediator extends AbstractMediator {
//中介者最重要的方法
public void execute(String str,Object...objects){
//搬家具体操作
if ("banjia".equals(str)) {
doBanjia(objects);
}
//司机求派单
if ("sijiNeedOrder".equals(str)) {
doGiveOrder(objects);
}
}
private void doBanjia(Object...objects) {
banjia.isOk();
car.isOk();
//找车,联系,约时间...
}
private void doGiveOrder(Object...objects) {
//找搬家人, 约时间...
banjia.isOk();
car.isOk();
}
}
接下来需要定义实体了,我们有多个实体,他们都需要有中介者作为属性,那先抽象一下
public abstract class AbstractEntity {
protected AbstractMediator mediator;
public AbstractEntity(AbstractMediator mediator){
this.mediator = mediator;
}
}
搬家者和搬家车司机作为具体实体
public BanJiaEntity extends AbstractEntity {
public BanJiaEntity(AbstractMediator mediator){
super(mediator);
}
public void banjia(String str,Object...objects) {
super.mediator.execute(str, objects)
}
public void isOk(){}
}
public CarEntity extends AbstractEntity {
public CarEntity(AbstractMediator mediator){
super(mediator);
}
public void needOrder(String str,Object...objects) {
super.mediator.execute(str, objects)
}
public void isOk(){}
}
这样,就实现了一个中介者模式。