• C++设计模式-外观(Facade)


    目录

    C++设计模式-外观(Facade)

    一、意图

    二、适用性

    三、结构

    四、参与者

    五、代码


    C++设计模式-外观(Facade)

    一、意图

    为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    二、适用性

    • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
    • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
    • 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。

    三、结构

     

    四、参与者

    • Facade

            知道哪些子系统类负责处理请求。

            将客户的请求代理给适当的子系统对象。

    • Subsystem classes

            实现子系统的功能。

            处理由Facade对象指派的任务。

            没有facade的任何相关信息;即没有指向facade的指针。

    五、代码

    1. #include
    2. using namespace std;
    3. class SubSystem {
    4. public:
    5. virtual void Operation() = 0;
    6. };
    7. class SubSystemA : public SubSystem {
    8. public:
    9. virtual void Operation() {
    10. cout << "SubSystem A" << endl;
    11. }
    12. };
    13. class SubSystemB : public SubSystem {
    14. public:
    15. virtual void Operation() {
    16. cout << "SubSystem B" << endl;
    17. }
    18. };
    19. class SubSystemC : public SubSystem {
    20. public:
    21. virtual void Operation() {
    22. cout << "SubSystem C" << endl;
    23. }
    24. };
    25. class Facade {
    26. public:
    27. Facade() {}
    28. virtual void Operation() = 0;
    29. };
    30. class ConcreteFacadeA : public Facade {
    31. public:
    32. ConcreteFacadeA() {
    33. subsystemA = new SubSystemA;
    34. subsystemB = new SubSystemB;
    35. subsystemC = new SubSystemC;
    36. }
    37. virtual void Operation() {
    38. cout << "Concrete Facade A : " << endl;
    39. subsystemA->Operation();
    40. subsystemB->Operation();
    41. subsystemC->Operation();
    42. }
    43. private:
    44. SubSystem* subsystemA;
    45. SubSystem* subsystemB;
    46. SubSystem* subsystemC;
    47. };
    48. class ConcreteFacadeB : public Facade {
    49. public:
    50. ConcreteFacadeB() {
    51. subsystemA = new SubSystemA;
    52. subsystemC = new SubSystemC;
    53. }
    54. virtual void Operation() {
    55. cout << "Concrete Facade B : " << endl;
    56. subsystemA->Operation();
    57. subsystemC->Operation();
    58. }
    59. private:
    60. SubSystem* subsystemA;
    61. SubSystem* subsystemC;
    62. };
    63. int main() {
    64. Facade* concreteFacadeA = new ConcreteFacadeA;
    65. concreteFacadeA->Operation();
    66. Facade* concreteFacadeB = new ConcreteFacadeB;
    67. concreteFacadeB->Operation();
    68. return 0;
    69. }

  • 相关阅读:
    深入理解Laravel(CVE-2021-3129)RCE漏洞(超2万字从源码分析黑客攻击流程)
    启动Tomcat报:Failed to initialize connector [Connector[HTTP/1.1-80]
    Redis-带你深入学习数据类型zset
    并查集略解
    网安学习-Linux提权
    云原生 | 企业内使用 CoreDNS 构建高性能、插件化的DNS服务器
    Objective-C blocks 概要
    Apollo(阿波罗)分布式配置中心
    【vue3】13.跟着官网学习vue3-模版引用,provide/inject,父子组件相互调用方法,defineExpose
    Debezium系列之:在K8s集群中部署Debezium Operator运行Debezium Server的详细步骤
  • 原文地址:https://blog.csdn.net/qq_40660998/article/details/133628979