今天要設計一台餐當客戶點餐時就會自動把餐點送到客戶面前的無人搬運車我們應該如何設計呢?
為系統中的模組定義一組接口,提供高層模組一個統一介面。
簡化用戶端與模組得耦合,讓用戶端只需要注意流程及操作情境,
不需要了解模組間的交互流程。
先來簡化開頭的問題:
當客戶按下點餐按鍵,車子就會移動到客戶旁邊。
這邊的移動到客戶旁邊我們可以細分成兩件事:
//建立一個負責移動的模組
public class AGVMove{
public void move(int x,int y){
//TODO:處理移動的程式碼
}
}
//建立一個負責導航的模組
public class AGVNavigation{
public void getPos(int number,out int x ,out int y){
//TODO: 將桌號規劃成一個目的地(x,y)
}
}
//定義一個對上層用戶端統一的接口
public class Facade{
private AGVMove move = new AGVMove();
private AGVNavigation nav = new AGVNavigation();
public void order(int number){
int x,y;
//取得移動的目的地
nav.getPos(number,x,y);
//執行移動指令
move.move(x,y);
}
}
public static void main(){
// 建立一個接口物件
Facade facade = new Facade();
//當7號桌的用戶想要點餐時,我們只需要對facde下達點餐的指令
facade.order(7);
}
我們可以從循序圖上看出,最後實際與使用者互動的只有facade
這個物件,
主程式與系統上的模組完全地的切割開來。
這種設計模式在有一定開發經驗的人,即便沒有自己這樣設計,
也或多或少都有接觸過這種設計模式。
因為這種模式與使用開發好的套件(package)其實是同一個概念。
在使用的時候通常不會去在意套件內部所有模組的交互,
而是注重對方提供的API回傳出來的結果。
所以當我們自己在開發的時候,如果想到外觀模式的時候,
也可以思考看看是不是能將外觀模式整塊獨立出來做成
動態庫(.so
、.dll
等)。
可以提升未來移植的便利性