11 结构型模式-----外观模式

模式动机(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》 在增加新的子系统时,必须修改外观类代码,此时如果将外观类设计为接口类,那么只需修改其具体实现类即可,可以确保与客户之间的接口保持不变。

 

 

 

原文地址:https://www.cnblogs.com/benxintuzi/p/4550928.html