首页 > 代码库 > Facade Pattern(外观模式)

Facade Pattern(外观模式)

  • 外观(Facade)模式:

  外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行。

 

  • 外观模式的结构:

 

门面(Facade):

  客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统(subsystem):

  可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

 

Facade.h

 1 //Facade.h 2 # ifndef _FACADE_H_ 3 # define _FACADE_H_ 4  5 class Subsystem1 6 { 7 public: 8         Subsystem1(); 9         ~Subsystem1();10         void Operation();11 protected:12 private:13 };14 15 class Subsystem216 {17 public:18         Subsystem2();19         ~Subsystem2();20         void Operation();21 protected:22 private:23 };24 25 class Facade26 {27 public:28         Facade();29         ~Facade();30         void OperationWrapper();31 protected:32 private:33         Subsystem1* p_subs1;34         Subsystem2* p_subs2;35 };36 37 # endif
View Code

 

Facade.cpp

 1 //Facade.cpp 2 # include <iostream> 3 # include "Facade.h" 4 using namespace std; 5  6 Subsystem1::Subsystem1()        {} 7 Subsystem1::~Subsystem1()       {} 8 void Subsystem1::Operation() 9 {10         cout << "Subsystem1::Operation" << endl;11 }12 13 Subsystem2::Subsystem2()        {}14 Subsystem2::~Subsystem2()       {}15 void Subsystem2::Operation()16 {17         cout << "Subsystem2::Operation" << endl;18 }19 20 Facade::Facade()21 {22         this->p_subs1 = new Subsystem1();23         this->p_subs2 = new Subsystem2();24 }25 Facade::~Facade()26 {27         delete p_subs1;28         delete p_subs2;29 }30 void Facade::OperationWrapper()31 {32         this->p_subs1->Operation();33         this->p_subs2->Operation();34 }
View Code

 

main.cpp

 1 //main.cpp 2 # include <iostream> 3 # include "Facade.h" 4 using namespace std; 5  6 int main() 7 { 8         Facade* fac = new Facade(); 9         fac->OperationWrapper();10         return 0;11 }
View Code

 

result:

blank@linux-bai:~/Projects/Facade> g++ -o a *.cpp && ./a
Subsystem1::Operation
Subsystem2::Operation

 

外观模式的例子:

  如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、缴费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。

  首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。

 

  解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。