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