模式动机(Facade Pattern):在设计一个复杂系统时,一般会将其分解为若干个具有特定功能的子系统以便于分析设计,这样的话就会导致数量众多的子系统接口出现,使得与调用者的交互变得复杂了。解决办法是在所有子系统的上一层提供一个外观类(Facade),其负责对所有子系统的统一调用,客户只需和外观类交互即可。
模式结构图:
模式代码:
bt_外观模式.h:
1 #ifndef FP_H 2 #define FP_H 3 #include <iostream> 4 5 /* 6 定义子系统SubSys* 7 */ 8 class SubSysA 9 { 10 public: 11 void UseSysA(){ std::cout << "Use SubSystem A" << std::endl; } 12 }; 13 class SubSysB 14 { 15 public: 16 void UseSysB(){ std::cout << "Use SubSystem B" << std::endl; } 17 }; 18 class SubSysC 19 { 20 public: 21 void UseSysC(){ std::cout << "Use SubSystem C" << std::endl; } 22 }; 23 24 /* 25 定义外观类Facade 26 */ 27 class Facade 28 { 29 public: 30 void Operation() 31 { 32 pa->UseSysA(); 33 pb->UseSysB(); 34 pc->UseSysC(); 35 } 36 37 private: 38 SubSysA* pa; 39 SubSysB* pb; 40 SubSysC* pc; 41 }; 42 43 #endif // FP_H
测试用例.cpp:
1 #include "bt_外观模式.h" 2 3 int main() 4 { 5 std::cout << "***** 外观模式测试 *****" << std::endl; 6 Facade* pf = new Facade; 7 pf->Operation(); 8 delete pf; 9 10 return 0; 11 }
模式分析:
1》 外观模式降低了客户与子系统之间的耦合性,使得客户端编码更加简洁。 如果用抽象接口设计Façade类,由具体的Facade子类对应不同的子系统的实现,那么可以进一步降低客户与子系统之间的耦合。
2》 如果客户对于子系统设计比较熟悉,那么可以跳过外观类直接访问子系统的接口。
3》 在系统分层设计时,可以考虑使用外观类作为层间接口,这样可以降低不同层次之间的依赖。
4》 一个系统可以同时拥有多个外观类,使得每个外观类负责固定区域子系统,这样有时候便于管理。
5》 在增加新的子系统时,必须修改外观类代码,此时如果将外观类设计为接口类,那么只需修改其具体实现类即可,可以确保与客户之间的接口保持不变。