当前位置: 首页 > article >正文

C++ 设计模式:门面模式(Facade Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 代理模式
链接:C++ 设计模式 - 中介者
链接:C++ 设计模式 - 适配器

门面模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个一致(稳定)的界面。门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。

1.问题分析

在开发中,尤其是大型系统中,子系统之间的交互和依赖关系可能非常复杂。客户端需要调用多个子系统的接口来完成一个功能,这会导致以下问题:

  • 复杂性增加:客户端代码需要了解多个子系统的接口和调用顺序,增加了代码的复杂性。
  • 高耦合度:客户端与多个子系统直接交互,导致客户端与子系统之间的耦合度很高,难以维护和扩展。
  • 难以使用:对于新手或不熟悉系统的开发者来说,直接使用多个子系统的接口可能会感到困难。

为了解决这些问题,我们可以使用门面模式。门面模式通过提供一个高层接口,简化了客户端对多个子系统的使用,降低了系统的复杂性和耦合度。

门面模式并非一个集装箱,可以任意地放进任何多个对象。组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。它更注重从架构的层次去看整个系统,而不是单个类的层次,门面模式很多时候更是一种架构设计模式。

2.实现步骤

  1. 定义子系统类:实现子系统的具体功能。每个子系统类负责处理特定的任务,并提供相应的接口供外部调用。
  2. 定义Facade类:提供一个高层接口,调用子系统类的功能。Facade类封装了子系统的复杂性,对外提供简化的接口。
  3. 客户端代码:通过Facade类来访问子系统的功能。客户端只需要与Facade类交互,而不需要直接与子系统类交互。

3.代码示例

以机器人作为示例。

3.1.定义子系统类

// 运动子系统
class MovementSystem {
 public:
  void start() { std::cout << "Movement system started." << std::endl; }

  void stop() { std::cout << "Movement system stopped." << std::endl; }
};
// 语音子系统
class SpeechSystem {
 public:
  void start() { std::cout << "Speech system started." << std::endl; }

  void stop() { std::cout << "Speech system stopped." << std::endl; }

  void speak(const std::string& message) { std::cout << "Robot says: " << message << std::endl; }
};
// 传感器子系统
class SensorSystem {
 public:
  void activate() { std::cout << "Sensor system activated." << std::endl; }

  void deactivate() { std::cout << "Sensor system deactivated." << std::endl; }

  void readSensors() { std::cout << "Reading sensor data..." << std::endl; }
};

3.2.定义Facade类

// Facade类,提供一个高层接口,封装子系统的复杂性
class RobotFacade {
 public:
  RobotFacade() : movementSystem_(new MovementSystem()), speechSystem_(new SpeechSystem()), sensorSystem_(new SensorSystem()) {}

  ~RobotFacade() {
    delete movementSystem_;
    delete speechSystem_;
    delete sensorSystem_;
  }

  void startRobot() {
    std::cout << "Starting robot..." << std::endl;
    sensorSystem_->activate();
    movementSystem_->start();
    speechSystem_->start();
    speechSystem_->speak("Hello, I am your robot assistant.");
  }

  void stopRobot() {
    std::cout << "Stopping robot..." << std::endl;
    speechSystem_->speak("Goodbye!");
    movementSystem_->stop();
    speechSystem_->stop();
    sensorSystem_->deactivate();
  }

  void performTask(const std::string& task) {
    std::cout << "Performing task: " << task << std::endl;
    sensorSystem_->readSensors();
    speechSystem_->speak("I am performing the task: " + task);
    // 这里可以添加更多的任务逻辑
  }

 private:
  MovementSystem* movementSystem_;
  SpeechSystem* speechSystem_;
  SensorSystem* sensorSystem_;
};

3.3.客户端代码

通过Facade类来访问子系统的功能

int main() {
  RobotFacade robot;

  // 启动机器人
  robot.startRobot();

  // 执行任务
  robot.performTask("cleaning");

  // 停止机器人
  robot.stopRobot();

  return 0;
}

http://www.kler.cn/a/460014.html

相关文章:

  • Java 代码编译和解析方法信息
  • HTML5实现好看的二十四节气网页源码
  • 分布式算法(五):初识ZAB协议
  • 接口测试Day04-postman生成测试报告ihrm项目
  • 永磁同步电机负载估计算法--自适应龙伯格观测器
  • CUDA与Microsoft Visual Studio不兼容问题
  • 基于Ubuntu2404桌面版制作qcow2镜像
  • 玛哈特矫平机助力其龙机械,引领汽摩配件制造技术升级
  • 中犇科技数字化智能中台系统login存在sql注入漏洞
  • 015-spring-动态原理、AOP的xml和注解方式
  • 【每日学点鸿蒙知识】自定义时间选择器、Image加载本地资源、线程切换、hap包安装、沉浸式无效
  • k8s的可观测性
  • Airbnb/Booking 系统设计(high level architecture)
  • java工作流模式、背包模式、适配器工厂模式整合架构,让服务任务编排更便捷
  • 如何在LabVIEW中更好地使用ActiveX控件?
  • JJJ:linux等待队列用法 init_waitqueue_entry
  • Java虚拟机——JVM高级特性与最佳实践
  • 第10章 初等数论
  • python修改ppt中的文字部分及插入图片
  • 【TG\SE二次开发】天工CAD二次开发-c++模板介绍
  • UniApp 路由导航详解
  • 【数据结构】非线性数据结构——图
  • Oracle复合索引规则指南
  • 大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!
  • 【Linux知识】exec命令行详解
  • 关于 覆铜与导线之间间距较小需要增加间距 的解决方法