莞城区网站建设公司/重庆seo小z博客

莞城区网站建设公司,重庆seo小z博客,策划案模板范文,什么是网站后台建设注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途​​ 核心思想​ ​桥接模式:将抽象部分与实现部分分离,使二者可以独立变化。​关键用途: ​1.拆分复杂继承…

注意:复现代码时,确保 VS2022 使用 C++17/20 标准以支持现代特性。

抽象与实现的解耦之道


1. 模式定义与用途​​

核心思想​

  • ​桥接模式:将抽象部分与实现部分分离,使二者可以独立变化。​
  • 关键用途:
    ​1.拆分复杂继承树:避免因多维度扩展导致的类爆炸。
    ​2.运行时切换实现:动态组合不同的抽象与实现(如渲染引擎、数据存储方式)。
  • 经典场景​
    1.图形库:形状(抽象)与渲染API(实现)的组合。
    2.设备控制:遥控器(抽象)与电器设备(实现)的解耦。

2. 模式结构解析

+---------------------+          +---------------------+  
|      Abstraction     |          |   Implementor       |  
+---------------------+          +---------------------+  
| - impl: Implementor |<>------->| + operationImpl()   |  
| + operation(): void |          +---------------------+  
+---------------------+                    ^  ^                                    |  |                              +-----+-------------+  |                              |                   |  
+---------------------+      +-------------------+    +-------------------+  
| RefinedAbstraction  |      | ConcreteImplA     |    | ConcreteImplB     |  
+---------------------+      +-------------------+    +-------------------+  
| + operation()       |      | + operationImpl() |    | + operationImpl() |  
+---------------------+      +-------------------+    +-------------------+  

角色说明​

  1. Abstraction:抽象部分的基类,持有实现部分的引用。
  2. RefinedAbstraction:扩展抽象功能的具体类。
  3. Implementor:实现部分的接口。
  4. ConcreteImplementor:实现部分的具体类。

3. 简单示例:图形渲染引擎桥接​

​场景:形状与渲染API解耦

// 实现部分:渲染API接口  
class RenderAPI {  
public:  virtual void renderCircle(float x, float y, float radius) = 0;  virtual ~RenderAPI() = default;  
};  // 抽象部分:形状基类  
class Shape {  
public:  Shape(RenderAPI& api) : api_(api) {}  virtual void draw() = 0;  
protected:  RenderAPI& api_;  
};  // 客户端调用  
class Circle : public Shape {  
public:  Circle(RenderAPI& api, float x, float y, float r)  : Shape(api), x_(x), y_(y), radius_(r) {}  void draw() override {  api_.renderCircle(x_, y_, radius_);  }  
private:  float x_, y_, radius_;  
};  

4. 完整代码:多API与多形状支持​

步骤1:实现部分(渲染API)

// 实现接口  
class RenderAPI {  
public:  virtual void renderCircle(float x, float y, float radius) = 0;  virtual void renderRect(float x, float y, float w, float h) = 0;  virtual ~RenderAPI() = default;  
};  // OpenGL实现  
class OpenGLAPI : public RenderAPI {  
public:  void renderCircle(float x, float y, float radius) override {  std::cout << "OpenGL渲染圆形:位置(" << x << "," << y << "), 半径" << radius << "\n";  }  void renderRect(float x, float y, float w, float h) override {  std::cout << "OpenGL渲染矩形:位置(" << x << "," << y << "), 尺寸" << w << "x" << h << "\n";  }  
};  // Vulkan实现  
class VulkanAPI : public RenderAPI {  
public:  void renderCircle(float x, float y, float radius) override {  std::cout << "Vulkan渲染圆形:位置(" << x << "," << y << "), 半径" << radius << "\n";  }  void renderRect(float x, float y, float w, float h) override {  std::cout << "Vulkan渲染矩形:位置(" << x << "," << y << "), 尺寸" << w << "x" << h << "\n";  }  
};  

步骤2:抽象部分(形状与扩展)​

// 抽象基类(使用智能指针管理实现)  
class Shape {  
public:  Shape(std::shared_ptr<RenderAPI> api) : api_(api) {}  virtual void draw() = 0;  virtual ~Shape() = default;  
protected:  std::shared_ptr<RenderAPI> api_;  
};  // 具体形状:圆形  
class Circle : public Shape {  
public:  Circle(std::shared_ptr<RenderAPI> api, float x, float y, float r)  : Shape(api), x_(x), y_(y), radius_(r) {}  void draw() override {  api_->renderCircle(x_, y_, radius_);  }  
private:  float x_, y_, radius_;  
};  // 具体形状:矩形  
class Rectangle : public Shape {  
public:  Rectangle(std::shared_ptr<RenderAPI> api, float x, float y, float w, float h)  : Shape(api), x_(x), y_(y), width_(w), height_(h) {}  void draw() override {  api_->renderRect(x_, y_, width_, height_);  }  
private:  float x_, y_, width_, height_;  
};  

步骤3:客户端动态组合

int main() {  // 创建不同渲染API  auto opengl = std::make_shared<OpenGLAPI>();  auto vulkan = std::make_shared<VulkanAPI>();  // 动态组合形状与API  Circle glCircle(opengl, 10, 10, 5);  Circle vkCircle(vulkan, 20, 20, 8);  Rectangle glRect(opengl, 5, 5, 10, 6);  glCircle.draw();  // 输出:OpenGL渲染圆形:位置(10,10), 半径5  vkCircle.draw();  // 输出:Vulkan渲染圆形:位置(20,20), 半径8  glRect.draw();  // 输出:OpenGL渲染矩形:位置(5,5), 尺寸10x6  
}  

5. 优缺点分析

优点​​缺点
分离抽象与实现,减少继承层次增加类的数量
支持运行时动态切换实现需要设计合理的抽象接口
提升跨平台、跨模块的扩展性对简单场景可能过度设计

6. 调试与优化策略​

调试技巧(VS2022)​​

  1. 验证桥接连接
    draw()方法中设置断点,检查api_指针是否指向正确的实现对象。
  2. 多态类型识别
    使用typeid(*api_).name()输出实际类型(需启用RTTI)。​

性能优化​

  1. 缓存实现对象
    对频繁使用的实现(如OpenGLAPI)使用单例或对象池。
  2. 移动语义优化
// 使用移动语义传递渲染API所有权  
Shape(std::shared_ptr<RenderAPI>&& api) : api_(std::move(api)) {}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践

文章目录 在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践一、下载 Kafka-0.9二、启动 Zookeeper 和 Kafka三、创建 Spring Boot 项目四、引入 kafka 依赖五、移除 Kafka 自动配置六、编写 Kafka 生产者6.1 Kafka配置类6.2 生产者监听类 七、编写Controller发送Kafka八、验证消费…

r1-reasoning-rag:一种新的 RAG 思路

最近发现了一个开源项目&#xff0c;它提供了一种很好的 RAG 思路&#xff0c;它将 DeepSeek-R1 的推理能力结合 Agentic Workflow 应用于 RAG 检索 项目地址 https://github.com/deansaco/r1-reasoning-rag.git 项目通过结合 DeepSeek-R1、Tavily 和 LangGraph&#xff0c;实现…

车载以太网测试-3【Wireshark介绍】

1 摘要 Wireshark 是一款开源的网络协议分析工具&#xff0c;广泛用于网络故障排查、协议分析、网络安全检测等领域。它能够捕获网络数据包&#xff0c;并以详细的、可读的格式显示这些数据包的内容。广泛应用于车载网络测试&#xff0c;是车载网络测试工程师必须掌握的工具。…

基于跨模态地图学习的视觉语言导航

前言 本工作开展的背景&#xff1a; 人类和其他物种构建类似地图的环境表示来完成寻路&#xff1a; &#xff08;1&#xff09;当人类只使用现成的驾驶或步行路径到达目标时&#xff0c;构建认知地图和获取空间知识的能力就会下降&#xff1b; &#xff08;2&#xff09;另…

Ubuntu20.04本地配置IsaacGym Preview 4的G1训练环境(一)

Ubuntu20.04本地配置IsaacGym Preview 4的G1训练环境 配置conda虚拟环境安装pytorch、cuda和cudnn安装IsaacGym Preview 4配置rsl_rl配置unitree_rl_gym配置unitree_sdk2py 写在前面&#xff0c;要求完成anaconda配置&#xff0c;若没完成&#xff0c;请参考本人其余博客&#…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

八卡5090服务器首发亮相!

AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力&#xff0c;在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出&#xff0c;正促使各行业应用端算力需求向推理主导转变&#xff0c;呈爆发式增长 。 随着 DeepS…

计算机视觉|Swin Transformer:视觉 Transformer 的新方向

一、引言 在计算机视觉领域的发展历程中&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而&#xff0c;CNN 在捕捉全…

常见Web应用源码泄露问题

文章目录 前言一、常见的源码泄露漏洞git源码泄露SVN源码泄露DS_Store文件泄漏网站备份压缩文件泄露WEB-INF/web.xml泄露CVS泄露.hg源码泄露Bazaar/bzr泄露.swp文件泄露 前言 在Web应用方面对于安全来说&#xff0c;可能大家对SQL注入、XSS跨站脚本攻击、文件上传等一些漏洞已…

记录一次wifi版有人物联串口服务器调试经过

1、首先买了一个华为的wifi路由器&#xff0c;连接上以后&#xff0c;设置好网络名字和wifi密码 2、用网线连接串口服务器&#xff0c;通过192.168.1.1登录&#xff0c;进行配置 找到无线客户端配置&#xff0c;先在基本配置中打开5G配置&#xff0c;然后再去5.8G配置中设置 …

Android 平台架构系统启动流程详解

目录 一、平台架构模块 1.1 Linux 内核 1.2 硬件抽象层 (HAL) 1.3 Android 运行时 1.4 原生 C/C 库 1.5 Java API 框架 1.6 系统应用 二、系统启动流程 2.1 Bootloader阶段 2.2 内核启动 2.3 Init进程&#xff08;PID 1&#xff09; 2.4 Zygote与System Serv…

【Windows下Gitbook快速入门使用】

Windows下Gitbook快速入门使用 1 工具安装1.1 Node.js下载安装1.1 环境变量1.2 npm配置1.3 安装gitbook 2 gitbook使用2.1 gitbook 无法执行2.2 gitbook常用命令 Gitbook是一个软件&#xff0c;使用Git和Markdown来编排书本&#xff1b; GitBook helps you pushlish beautiful …

RK3588V2--HYM8563TS RTC 实时时钟适配移植

1. 什么是RTC RTC&#xff08;Real-Time Clock&#xff0c;实时时钟&#xff09;是一种电子设备或芯片&#xff0c;它用于保持当前时间和日期&#xff0c;即使系统关闭或断电也能持续计时。RTC 通常用于计算机、嵌入式系统、物联网设备等需要精确时间管理的场景。 1.1 RTC 的…

MHA集群

一.MHA集群 MHA master high avavibility 主服务器高可用 如上图所示&#xff0c;我们之前说过&#xff0c;如果在主从复制架构中主服务器出现故障&#xff0c;就需要我们将从服务器作为主服务器&#xff0c;等故障的主服务器修复好之后&#xff0c;再将修好的主服务器作为从服…

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…

微信小程序+SpringBoot的单词学习小程序平台(程序+论文+讲解+安装+修改+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 &#xff08;一&#xff09;社会需求背景 在全球化的大背景下&#xff0c;英语作为国际…

鸿蒙HarmonyOS评论功能小demo

评论页面小demo 效果展示 1.拆解组件&#xff0c;分层搭建 我们将整个评论页面拆解为三个组件&#xff0c;分别是头部导航&#xff0c;评论项&#xff0c;回复三个部分&#xff0c;然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…

解析 SQL,就用 sqlparse!

文章目录 解析 SQL&#xff0c;就用 sqlparse&#xff01;一、背景&#xff1a;为什么你需要 sqlparse&#xff1f;二、什么是 sqlparse&#xff1f;三、如何安装 sqlparse&#xff1f;四、简单易用的库函数1\. parse(sql)2\. format(sql, **options)3\. split(sql)4\. get_typ…

点云软件VeloView开发环境搭建与编译

官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程&#xff1a; 安装vs2019&#xff0c;windows sdk&#xff0c;qt5.14.2&#xff08;没安装到5.15.7&#xff09;&#xff0c;git&#xff0c;cmake3.31&#xff0c;python3.7.9&#xff0c;ninja下载放到…

DeepSeek系列模型技术报告的阅读笔记

DeepSeek系列模型技术报告的阅读笔记 之前仔细阅读了DeepSeek系列模型的主要技术方面内容与发展脉络&#xff0c;以下是DeepSeek系列模型技术报告的笔记&#xff0c;有错误的地方欢迎指正&#xff01; 文章目录 DeepSeek系列模型技术报告的阅读笔记GQADeepseek MoEAbstractIn…