概述
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
定义
外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
角色
Facade:
外观角色
SubSystem:
子系统角色
场景
- 想为复杂的子系统提供一个简单的界面
- 客户端和抽象的实现类之间有很多依赖关系
- 想要对子系统进行分层,请使用外观来定义每个子系统级别的入口点
实现一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
//子系统类A class SubsystemA { public: void suboperation() { std::cout << "Subsystem A method" << std::endl; //... } //... }; //子系统类B class SubsystemB { public: void suboperation() { std::cout << "Subsystem B method" << std::endl; //... } //... }; //子系统类C class SubsystemC { public: void suboperation() { std::cout << "Subsystem C method" << std::endl; //... } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
//外观类 class Facade { public: Facade():subsystemA(new subsystemA()),subsystemB(new subsystemB()),subsystemC(new subsystemC()){ } ~Facade() { delete subsystemA; delete subsystemB; delete subsystemC; } void operation1() { subsystemA->suboperation(); subsystemB->suboperation(); //... } void operation2() { subsystemC->suboperation(); //... } //... private: SubsystemA * subsystemA; SubsystemB * subsystemB; SubsystemC * subsystemC; } |
|
auto main()->int { Facade * dacade = new Facade(); facade->operation1(); facade->operation2(); delete facade; return 0; } |
实现二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#include <iostream> #include <memory> // 使用智能指针 // SubsystemA class Engine { public: void start() { std::cout << "Engine started." << std::endl; } }; // SubsystemB class Lights { public: void turnOn() { std::cout << "Lights turned on." << std::endl; } }; // SubsystemC class MusicSystem { public: void playMusic() { std::cout << "Playing music." << std::endl; } }; // Facade class Car { public: Car() : engine(std::make_unique<Engine>()), lights(std::make_unique<Lights>()), musicSystem(std::make_unique<MusicSystem>()) {} void startCar() { engine->start(); lights->turnOn(); musicSystem->playMusic(); std::cout << "Car is ready to go." << std::endl; } private: std::unique_ptr<Engine> engine; std::unique_ptr<Lights> lights; std::unique_ptr<MusicSystem> musicSystem; }; int main() { Car myCar; myCar.startCar(); return 0; } |