抽絲剝繭——門面和調停者設計模式

調停者和門面設計模式

今天我們來聊兩個設計模式:調停者設計模式和門面設計模式,為什麼要將他們放在一起講解,因為他們兩個東東太像了,僅僅是由於作用的地方不同而產生的不同的叫法。

我們用一個對於我們90後最難的一個問題來入手吧。假設我們厭倦了城市生活,想要找一個安靜的地方安家,養豬,順便寫一個豬臉識別來分類管理這些豬(夢想中的生活)。而在做這些事情的前提,我們必須建造一個房子和一個豬圈。

我們來看一下我們以前會怎麼做。

蓋房子需要工人,磚頭,水泥等等,我們需要一個一個聯繫所需要的人。但我這麼聰明當然不會這麼幹了,所以我找了一個人來幫我完成這些事情,於是就成為了這樣的流程。

我找了一個包工頭,代理商幫我去完成這些事情。這個流程就是一個完整的門面模式。是不是感覺和代理模式有點像,幫我做事情。其實吧設計模式到最後就殊途同歸了,正所謂,太極劍法,學多少忘多少,最後記得的只是太極劍。

我們回到編程領域,我們來看一下門面模式具體的類圖實現

那接下來我們來看一下調停者設計模式。

它和門面模式最大的區別就是門面模式是擋在外層的,而它是在所有服務中間的。我們來看一下它的原理圖。

我們再來看一下它的類圖實現

發現了沒,兩個模式的類圖實現幾乎相同,所以他們的程式碼實現也幾乎相同。

了解了他們的原理以後,我們來聊聊他們在實際程式碼中的應用。

門面模式:伺服器部署時的網關,將所有的請求攔截,具體的方法轉發由網關決定

調停者模式:協調中間件,微服務中將所有的服務註冊到類似於zookeeper的協調中間件中,通過中間件訪問其他服務;消息中間件,需要什麼消息通過消息中間件進行獲取。

對於一些比較老的項目,門面模式和調停者模式的調度中心很有可能是一個,如通過Nginx管理服務。

我們來看一下具體的程式碼實現吧。

門面模式程式碼實現(角色組成)

  • 子系統
class Cement{
    void cement(){
        System.out.println("水泥");
    }
}

class Worker{
    void worker(){
        System.out.println("工人");
    }
}

class Brick{
    void brick(){
        System.out.println("磚頭");
    }
}
  • 門面
class Contractor{
    private Cement cement = new Cement();
    private Worker worker = new Worker();
    private Brick brick = new Brick();

    void cement(){
        cement.cement();
    }

    void worker(){
        worker.worker();
    }

    void brick(){
        brick.brick();
    }
}

調停者模式的程式碼實現和門面模式幾乎相同。兩者只是因為應對與不同的位置而誕生,本質相同。

更多原創文章請關注公眾號@MakerStack