外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得子系统更加容易使用。
Façade:外观类,知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象
Subsystem Classes:子系统类几何,实现子系统的功能,处理Façade对象指派的任务,子类中没有对Façade对象的引用。
何时使用:
设计初期,将两个层分离,层与层之间建立外观Façade
开发阶段,子系统因为重构而复杂,增加外观Façade提供简单接口,减少依赖
维护遗留的大型系统时,为新系统开发外观Façade类,新系统与Façade对象交互,Façade与遗留代码交互复杂工作。
main.cpp
#include <iostream> #include <stdlib.h> #include "Facade.h" using namespace std; void process() { Facade facade; facade.methodA(); facade.methodB(); } int main(int argc,char* argv[]) { process(); system("pause"); return 0; }
Facade.h
#ifndef FACADE_H #define FACADE_H #include <memory> #include "SubSystemOne.h" class Facade { public: Facade(void); ~Facade(void); void methodA(); void methodB(); public: //关键:外观类聚合多个子系统类,向外提供简单接口 std::shared_ptr<SubSystemOne> _ptrSubSystem1; std::shared_ptr<SubSystemTwo> _ptrSubSystem2; std::shared_ptr<SubSystemThree> _ptrSubSystem3; std::shared_ptr<SubSystemFour> _ptrSubSystem4; }; #endif
Facade.cpp
#include "Facade.h" #include <iostream> using namespace std; Facade::Facade(void) { _ptrSubSystem1.reset(new SubSystemOne); _ptrSubSystem2.reset(new SubSystemTwo); _ptrSubSystem3.reset(new SubSystemThree); _ptrSubSystem4.reset(new SubSystemFour); } Facade::~Facade(void) { } void Facade::methodA() { cout << "方法组A:" << endl; _ptrSubSystem1->methodOne(); _ptrSubSystem2->methodTwo(); _ptrSubSystem4->methodFour(); } void Facade::methodB() { cout << "方法组B:" << endl; _ptrSubSystem2->methodTwo(); _ptrSubSystem3->methodThree(); }
SubsystemOne.h
#ifndef SUBSYSTEMONE_H #define SUBSYSTEMONE_H class SubSystemOne { public: SubSystemOne(void); ~SubSystemOne(void); void methodOne(); }; class SubSystemTwo { public: SubSystemTwo(void); ~SubSystemTwo(void); void methodTwo(); }; class SubSystemThree { public: SubSystemThree(void); ~SubSystemThree(void); void methodThree(); }; class SubSystemFour { public: SubSystemFour(void); ~SubSystemFour(void); void methodFour(); }; #endif
SubSystemOne.cpp
#include "SubSystemOne.h" #include <iostream> using namespace std; SubSystemOne::SubSystemOne(void) { } SubSystemOne::~SubSystemOne(void) { } void SubSystemOne::methodOne() { cout << "子系统方法1" << endl; } SubSystemTwo::SubSystemTwo(void) { } SubSystemTwo::~SubSystemTwo(void) { } void SubSystemTwo::methodTwo() { cout << "子系统方法2" << endl; } SubSystemThree::SubSystemThree(void) { } SubSystemThree::~SubSystemThree(void) { } void SubSystemThree::methodThree() { cout << "子系统方法3" << endl; } SubSystemFour::SubSystemFour(void) { } SubSystemFour::~SubSystemFour(void) { } void SubSystemFour::methodFour() { cout << "子系统方法4" << endl; }