首页 > 代码库 > 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
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 }
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 }
result:
blank@linux-bai:~/Projects/Facade> g++ -o a *.cpp && ./a
Subsystem1::Operation
Subsystem2::Operation
外观模式的例子:
如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、缴费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。
首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。
解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。