【设计模式之外观模式 -- C++】

外观模式 -- 统一接口,简化调用

外观模式(Facade Pattern)是一种常用的软件设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更易于使用。外观模式定义了一个高层接口,这个接口使得这一子系统更易于使用。百度百科

1) 组成

1.一个基类;

2.n个相同接口的子系统类;

3.一个外观类;

大白话就是:有一个外观类,起到整体的调度;n个子系统的方法名相同,功能类型,可以统一调度

2)好处
  1. 简化接口:外观模式提供了一个统一的接口,隐藏了子系统的复杂性,使得子系统更易于使用。
  2. 提高了客户端使用的便利性:客户端不需要了解系统内部的复杂联系,只需要通过外观类来调用需要的功能。
  3. 提高了系统的灵活性和安全性:实现系统与客户端的解耦,使得系统的内部变化不会影响到客户端。
  4. 降低了代码耦合度:将客户端与复杂的子系统解耦,使得子系统的变化不会影响到客户端。
  5. 提供了一个访问子系统的统一入口:集中管理和降低对象之间的依赖关系。
3)使用场景
  1. 当你想为一个复杂的子系统提供一个简单的接口时。外观模式可以提供一个简单的默认视图,这个视图对于大多数客户来说足够,而只有需要更多的可定制性的客户才需要超越这个外观接口。
  2. 当客户和抽象类的实现部分之间存在很大的依赖性时。引入外观可以将子系统与客户以及其他子系统解耦,提高子系统的独立性和可移植性。
  3. 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,那么你可以让它们仅通过外观接口进行通信,从而简化了它们之间的依赖关系。
4)实现
  1. 定义一个基类:有start和stop方法
cpp 复制代码
class System {
public:
    virtual void Start() = 0;
    virtual void Stop() = 0;
};
  1. 定义两个个子类
cpp 复制代码
// 定义一个子类:程序1
class Program1 : public System {
public:
    void Start() override {
        cout << "Program1: Start.\n";
    }

    void Stop() override {
        cout << "Program1: Stop.\n";
    }
};

// 定义一个子类:程序2
class Program2 : public System {
public:
    void Start() override {
        cout << "Program2: Start.\n";
    }

    void Stop() override {
        cout << "Program2: Stop.\n";
    }
};
  1. 定义外观类
cpp 复制代码
class Facade {
private:
    System *program1_;
    System *program2_;

public:
    Facade() {
        program1_ = new Program1;
        program2_ = new Program2;
    }

    ~Facade() {
        delete program1_;
        delete program2_;
    }

    void Start() {
        program1_->Start();
        program2_->Start();
    }

    void Stop() {
        program1_->Stop();
        program2_->Stop();
    }
};
  1. 测试
cpp 复制代码
int main() {
    Facade *facade = new Facade;
    facade->Start();
    facade->Stop();
    delete facade;
    return 0;
}
  1. 结果
shell 复制代码
Program1: Start.
Program2: Start.
Program1: Stop.
Program2: Stop.
相关推荐
潼心1412o6 分钟前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i18 分钟前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
wuminyu31 分钟前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
All for pursuit.1 小时前
【回溯-6】79.单词搜索
数据结构·c++·算法·leetcode
Benny_Tang1 小时前
AT_arc180_d [ARC180D] Division into 3 题解
数据结构·c++·算法
殷色玫瑰2 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
努力努力再努力wz2 小时前
【CUDA入门系列】CUDA编程实战:设备选择、显存管理、Kernel、Stream 与 Event 全流程梳理
开发语言·c++
沫璃染墨3 小时前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
郝学胜_神的一滴3 小时前
C++ Templates 05:那些容易踩坑的技巧性基础知识
c++·visual studio
朝朝辞暮i3 小时前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2