桥接模式(Bridge Pattern) C++

上一节:适配器模式(Adapter Pattern) C++

文章目录

  • 0.理论
    • 1.组件
    • 2.使用场景
  • 1.实践

0.理论

桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心思想是将抽象部分与其实现部分分离,使它们可以独立地变化。通过使用组合关系而非继承关系,桥接模式能够提高代码的可扩展性和灵活性。

1.组件

  • 抽象化(Abstraction):这是一个抽象类,它持有一个对实现化对象的引用。抽象化定义了基于实现化对象的高层操作。
  • 细化抽象化(Refined Abstraction):这是抽象化的子类,它扩展了抽象化定义的接口。
  • 实现化(Implementor):这是一个接口或抽象类,定义了实现化角色的接口,包括它的具体实现。
  • 具体实现化(Concrete Implementor):这是实现化角色的具体实现类。

在这里插入图片描述

Bridge 模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相独立地进行修改。

2.使用场景

  • 当一个类存在两个独立变化的维度时,可以将这两个维度分离出来,使它们可以独立地进行扩展。
  • 当一个系统需要在构建时能够选择或切换不同的实现方法时。
  • 当要避免类的继承带来的固化关系时,使得系统更加灵活、易于扩展。

1.实践

在游戏开发中,桥接模式可以用于分离游戏的图形渲染引擎(实现化角色)和游戏中的对象(抽象化角色),以便独立地管理和扩展它们。这种分离使得更换或升级渲染引擎,或者添加新的游戏对象变得更加灵活和简单。假设我们正在开发一个游戏,其中包含多种类型的游戏对象,如敌人、玩家角色和环境元素。这些对象需要在不同的渲染引擎上进行渲染,比如OpenGL和DirectX。

实现化角色:渲染引擎接口

定义两个渲染引擎的接口,分别为OpenGLRenderer和DirectXRenderer,它们都实现了一个共同的接口Renderer。

// 渲染引擎接口
class Renderer {
public:virtual void renderShape(const std::string& shapeDescription) = 0;virtual ~Renderer() {}
};// OpenGL渲染引擎
class OpenGLRenderer : public Renderer {
public:void renderShape(const std::string& shapeDescription) override {std::cout << "OpenGL rendering " << shapeDescription << std::endl;}
};// DirectX渲染引擎
class DirectXRenderer : public Renderer {
public:void renderShape(const std::string& shapeDescription) override {std::cout << "DirectX rendering " << shapeDescription << std::endl;}
};

抽象化角色:游戏对象

定义游戏中的抽象对象GameObject,它持有一个对渲染引擎的引用,以便于对象可以使用不同的渲染引擎进行渲染。

// 游戏对象抽象
class GameObject {
protected:Renderer* renderer; // 渲染引擎
public:GameObject(Renderer* renderer) : renderer(renderer) {}virtual void draw() = 0; // 绘制方法,由子类实现virtual ~GameObject() {}
};// 具体游戏对象:玩家
class Player : public GameObject {
public:Player(Renderer* renderer) : GameObject(renderer) {}void draw() override {renderer->renderShape("Player");}
};// 具体游戏对象:敌人
class Enemy : public GameObject {
public:Enemy(Renderer* renderer) : GameObject(renderer) {}void draw() override {renderer->renderShape("Enemy");}
};

在这个例子中,GameObject是抽象化角色,它定义了游戏对象的基本结构和draw方法。Player和Enemy是细化抽象化角色,它们具体实现了draw方法来描述如何绘制自己。

现在,如果想要在游戏中使用不同的渲染引擎来渲染对象,只需要在创建游戏对象时传入不同的渲染引擎实例即可。

Renderer* opengl = new OpenGLRenderer();
Renderer* directx = new DirectXRenderer();GameObject* player = new Player(opengl); // 使用OpenGL渲染玩家
GameObject* enemy = new Enemy(directx); // 使用DirectX渲染敌人player->draw(); // 输出:OpenGL rendering Player
enemy->draw(); // 输出:DirectX rendering Enemydelete player;
delete enemy;
delete opengl;
delete directx;

实际上上面使用 Bridge 模式和使用带来问题方式的解决方案的根本区别在于是通过继承还是通过组合的方式去实现一个功能需求。

下一节:装饰器模式 (Decorator Pattern) C++

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

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

相关文章

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

浅谈密码学

文章目录 每日一句正能量前言什么是密码学对称加密简述加密语法Kerckhoffs原则常用的加密算法现代密码学的原则威胁模型&#xff08;按强度增加的顺序&#xff09; 密码学的应用领域后记 每日一句正能量 人生在世&#xff0c;谁也不能做到让任何人都喜欢&#xff0c;所以没必要…

幻兽帕鲁服务器哪家便宜?阿里云腾讯云京东云华为云对比

幻兽帕鲁服务器哪家便宜&#xff1f;阿里云腾讯云京东云华为云对比&#xff0c;阿里云更便宜&#xff0c;26元1个月。游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#x…

吸猫毛空气净化器哪个好?推荐除猫毛效果好宠物空气净化器品牌

当下有越来越多的家庭选择养宠物&#xff01;尽管家里变得更加温馨&#xff0c;但养宠可能会带来异味和空气中的毛发增多可能会带来健康问题&#xff0c;这是一个大问题&#xff01; 不想家里弥漫着异味&#xff0c;特别是来自宠物便便的味道&#xff0c;所以需要一款能够处理…

一张图读懂人工智能

一、生成人工智能的概念和应用&#xff0c;以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力&#xff0c;被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和&#xff0c;并回答任何…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

kali安装ARL灯塔(docker)

1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …

【STM32】江科大STM32学习笔记汇总(50)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…

React富文本编辑器开发(二)

我们接着上一节的示例内容&#xff0c;现在有如下需求&#xff0c;我们希望当我们按下某个按键时编辑器有所反应。这就需要我们对编辑器添加事件功能onKeyDown, 我们给 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

敏捷开发模型:一种灵活、协作和持续的软件开发方法

敏捷开发模型&#xff1a;一种灵活、协作和持续的软件开发方法 引言 在软件开发领域&#xff0c;随着市场需求的不断变化和技术的迅速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战&#xff0c;敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…

软件无线电SDR加人工智能算法实现无人机频谱探测

通用软件无线电接收机作为传感器实时接收探测无线电信号&#xff0c;加上深度学习算法实现频谱识别&#xff0c;(https://img-blog.csdnimg.cn/5a6c4d89a047453a94f763f4e67aeb17.png)

Unity(第二十四部)UI

在游戏开发中&#xff0c;用户界面&#xff08;UI&#xff09;是至关重要的一部分。它负责与玩家进行交互&#xff0c;提供信息&#xff0c;并增强游戏的整体体验。Unity 提供了强大的工具和功能来创建和管理 UI。 ui的底层就是画布&#xff0c;创建画布的时候会同时创建一个事…

java中开源json处理库介绍

在Java生态系统中&#xff0c;有几个常用的开源库用于处理JSON数据。这些库各有特点&#xff0c;适用于不同的场景。下面我将介绍几个流行的Java JSON处理库&#xff0c;包括它们的基本情况、主要特点和核心API。 Jackson 基本情况 Jackson是一个流行的Java库&…

selenium爬虫

方法选择和安装包 在动态网页并且登陆过程中不需要进行过于复杂的密码验证的时候使用selenium会非常的方便 安装准备过程也相对简单&#xff1a; 下载对应版本的chromedriver并且通过如下代码找到路径下载到python所在的目录&#xff1a; import sysprint(sys.executable) …

DC-DC转换电路简介

DC-DC转换电路简介 1. 源由2. 工作原理3. 转换芯片4. DC-DC干扰5. DC-DC滤波5.1 PCB Layout5.2 电容滤波5.3 电感滤波 6. DC-DC电感/电容取值实验如何做&#xff1f;7. 参考资料 1. 源由 虽然说嵌入式系统涉及软件、硬件、机械、结构、网络等诸多领域内容。因此&#xff0c;在…

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限&#xff1a; 监听用户是否开启权限或关闭权限&#xff1a; 退出app返回桌面&#xff1a; android申请权限&#xff1a; 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…

队列的结构概念和实现

文章目录 一、队列的结构和概念二、队列的实现三、队列的实现函数四、队列的思维导图 一、队列的结构和概念 什么是队列&#xff1f; 队列就是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 如上图所示&#x…

前端学习第二天-html提升

达标要求 了解列表的分类 熟练掌握列表的用法 熟练掌握表格的结构构成 合并单元格 表单的组成 熟练掌握表单控件分类的使用 1.列表 1.1 无序列表 <ul>&#xff1a;定义无序列表&#xff0c;并且只能包含<li>子元素。 <li>&#xff1a;定义列表项&a…

PDF文件签章,水印

首先准备好配置环境(详细参考配置PDF笔记) 生产PDF文件&#xff1a; 第一步&#xff1a; 实体类加注解&#xff1a;&#xff08;这个注解的作用是设置你pdf文件中列的名称&#xff0c;每个字段都要加&#xff09; 第二步&#xff1a; 编写后端方法, 先依赖注入 PdfService中…

分类问题经典算法 | 二分类问题 | Logistic回归:公式推导

目录 一. Logistic回归的思想1. 分类任务思想2. Logistic回归思想 二. Logistic回归算法&#xff1a;线性可分推导 一. Logistic回归的思想 1. 分类任务思想 分类问题通常可以分为二分类&#xff0c;多分类任务&#xff1b;而对于不同的分类任务&#xff0c;训练的主要目标是…