大白話講解設計模式之中介者模式

如何理解中介者模式

如何理解一個設計模式,首先需要了解他的應用場景,進而得出他的使用價值以及使用原因。我們從最容易理解的日常事務中舉箇中介者模式的栗子,對比加思考來理解中介者模式,包括何爲中介者,爲何需要中介者。

舉個栗子看模式

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

這樣,就實現了一箇中介者模式。

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