1. 程式人生 > >抽絲剝繭——門面和調停者設計模式

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

### 調停者和門面設計模式 今天我們來聊兩個設計模式:調停者設計模式和門面設計模式,為什麼要將他們放在一起講解,因為他們兩個東東太像了,僅僅是由於作用的地方不同而產生的不同的叫法。 我們用一個對於我們90後最難的一個問題來入手吧。假設我們厭倦了城市生活,想要找一個安靜的地方安家,養豬,順便寫一個豬臉識別來分類管理這些豬(夢想中的生活)。而在做這些事情的前提,我們必須建造一個房子和一個豬圈。 我們來看一下我們以前會怎麼做。 ![](https://gitee.com/onlyzl/image/raw/master/img/20200915153604.png) 蓋房子需要工人,磚頭,水泥等等,我們需要一個一個聯絡所需要的人。但我這麼聰明當然不會這麼幹了,所以我找了一個人來幫我完成這些事情,於是就成為了這樣的流程。 ![](https://gitee.com/onlyzl/image/raw/master/img/20200915153947.png) 我找了一個包工頭,代理商幫我去完成這些事情。這個流程就是一個完整的門面模式。是不是感覺和代理模式有點像,幫我做事情。其實吧設計模式到最後就殊途同歸了,正所謂,太極劍法,學多少忘多少,最後記得的只是太極劍。 我們回到程式設計領域,我們來看一下門面模式具體的類圖實現 ![](https://gitee.com/onlyzl/image/raw/master/img/20200915161337.png) 那接下來我們來看一下調停者設計模式。 它和門面模式最大的區別就是門面模式是擋在外層的,而它是在所有服務中間的。我們來看一下它的原理圖。 ![](https://gitee.com/onlyzl/image/raw/master/img/20200916090456.png) 我們再來看一下它的類圖實現 ![](https://gitee.com/onlyzl/image/raw/master/img/20200916093235.png) **發現了沒,兩個模式的類圖實現幾乎相同,所以他們的程式碼實現也幾乎相同。** 瞭解了他們的原理以後,我們來聊聊他們在實際程式碼中的應用。 **門面模式:**伺服器部署時的閘道器,將所有的請求攔截,具體的方法轉發由閘道器決定 **調停者模式:**協調中介軟體,微服務中將所有的服務註冊到類似於`zookeeper`的協調中介軟體中,通過中介軟體訪問其他服務;訊息中介軟體,需要什麼訊息通過訊息中介軟體進行獲取。 對於一些比較老的專案,門面模式和調停者模式的排程中心很有可能是一個,如通過`Nginx`管理服務。 我們來看一下具體的程式碼實現吧。 **門面模式程式碼實現(角色組成)** - **子系統** ```java class Cement{ void cement(){ System.out.println("水泥"); } } class Worker{ void worker(){ System.out.println("工人"); } } class Brick{ void brick(){ System.out.println("磚頭"); } } ``` - **門面** ```java 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(); } } ``` 調停者模式的程式碼實現和門面模式幾乎相同。兩者只是因為應對與不同的位置而誕生,本質相同。 更多原創文章請關注公眾號@Ma