抽絲剝繭——門面和調停者設計模式
阿新 • • 發佈:2020-11-07
### 調停者和門面設計模式
今天我們來聊兩個設計模式:調停者設計模式和門面設計模式,為什麼要將他們放在一起講解,因為他們兩個東東太像了,僅僅是由於作用的地方不同而產生的不同的叫法。
我們用一個對於我們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