大白话讲解设计模式之中介者模式

如何理解中介者模式

如何理解一个设计模式,首先需要了解他的应用场景,进而得出他的使用价值以及使用原因。我们从最容易理解的日常事务中举个中介者模式的栗子,对比加思考来理解中介者模式,包括何为中介者,为何需要中介者。

举个栗子看模式

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(){}
}

这样,就实现了一个中介者模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章