趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口
文章目錄
- 案例:自動駕駛飛機
- 外觀模式
- 總結
- 完整代碼與文檔
案例:自動駕駛飛機
隨著自動駕駛汽車的大賣,特X拉開始把目標轉向飛行領域,打算開發出一款能夠完全自動行駛的飛機,系統初步的設計如下
我們將所有系統的控制封裝為方法提供給客戶
客戶只需要按照上面的步驟啟動即可
但是,這樣的設計存在著嚴重的問題
- 存在著大量的方法,用戶存在學習成本
- 各個系統之間存在強耦合關系,例如我們不可能在沒有能源的情況下啟動導航和發動引擎
- 當需要關閉系統時,又要按照另一種關閉順序進行關閉
- 當系統更新換代時,用戶又需要學習另一套操作過程
上面的設計談得上智能嗎?自動駕駛飛機的本意就是要降低使用門檻,因此我們不應該把這些底層的方法開放給客戶,而是我們自己將其封裝為一套合理的、方便使用的上層方法,用戶只需要一鍵,就能夠完成這些任務,這就是外觀模式
外觀模式
外觀模式為子系統中的一組接口提供一個一致(穩定)的界面,Fa?ade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用(復用)。
外觀模式由兩部分組成
- Facade(外觀):負責將子系統中的接口整合為一個高層接口,供客戶使用。外觀中組合了子系統,并將任務委托給子系統處理
- SubSystem(子系統):即系統的各個組件
類圖如下
了解了外觀模式后,設計師重新規劃了設計圖,新的設計如下
設計師將所有系統的啟動、關閉方法封裝成為一個上層的方法,這樣用戶就不再需要關系其中的細節以及依賴關系,只需要調用這一個方法即可。不僅簡化了接口,還將客戶從組件的子系統中解耦
下面開始代碼的實現,首先給出幾個子系統的代碼,為了方便演示子系統內容基本一樣
class EngineSystem { public:void systemOn(){std::cout << "啟動能源系統" << std::endl;}void systemOff(){std::cout << "關閉能源系統" << std::endl;} };class DynamicSystem { public:void systemOn(){std::cout << "啟動動力系統" << std::endl;}void systemOff(){std::cout << "關閉動力系統" << std::endl;} }; class CoolingSystem { public:void systemOn(){std::cout << "啟動冷卻系統" << std::endl;}void systemOff(){std::cout << "關閉冷卻系統" << std::endl;} };class NavigationSystem { public:void systemOn(){st-d::cout << "啟動導航系統" << std::endl;}void systemOff(){std::cout << "關閉導航系統" << std::endl;} };接著我們將所有子系統的啟動和關閉,按照他們之間的依賴關系封裝為一個統一的啟動、關閉方法,開放給上層
class AutoAircraft { public:AutoAircraft(): _cooling(new CoolingSystem), _dynamic(new DynamicSystem), _engine(new EngineSystem), _navigaton(new NavigationSystem){}~AutoAircraft(){delete _cooling, _dynamic, _engine, _navigaton;}//統一啟動接口void systemOn(){_engine->systemOn();_cooling->systemOn();_dynamic->systemOn();_navigaton->systemOn();}//統一關閉接口void systemOff(){_navigaton->systemOff();_dynamic->systemOff();_cooling->systemOff();_engine->systemOff();}private:CoolingSystem* _cooling;DynamicSystem* _dynamic;EngineSystem* _engine;NavigationSystem* _navigaton; };測試代碼
int main() {AutoAircraft airCraft;airCraft.systemOn();cout << endl;airCraft.systemOff();return 0; }
在新的設計中,用戶只需要執行開啟和關閉,就能完成整個系統的開關,大大降低了操作的門檻,也避免了因為子系統互相依賴而發生的錯誤
總結
要點
- 外觀模式將客戶從一個復雜的子系統中解耦,簡化了用戶操作
- 通常用于簡化或者統一一群復雜的接口,減少系統相互依賴
- 需要將子系統組合進外觀中,并且外觀將工作委托給子系統,這就導致了不符合開放封閉原則,修改和拓展都有點麻煩
應用場景
- 當客戶端不需要知道系統內部的復雜聯系時,為復雜的模塊或子系統封裝一個供外界訪問的入口
- 將多個低粒度接口整合為高粒度接口,減少通信成本,通常用于網絡通信
完整代碼與文檔
如果有需要完整代碼或者markdown文檔的同學可以點擊下面的github鏈接
github
總結
以上是生活随笔為你收集整理的趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣谈设计模式 | 命令模式(Comman
- 下一篇: 趣谈设计模式 | 适配器模式(Adapt