桥接模式(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 模式和使用带来问题方式的解决方案的根本区别在于是通过继承还是通过组合的方式去实现一个功能需求。

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

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

相关文章

Linux系统——Nginx拓展

目录 一、重写功能——rewrite 1.if 1.1 if 2. return 2.1状态码301和302的区别 301 302 3. set 4. break 5. rewrite 5.1 rewrite flag使用 5.2 flag说明 5.3举例 5.3.1访问 bj 跳转 beijing 5.3.2举例——break 5.3.3 http 转 https 5.3.4 break 与 last …

windows系统使用Vscode在WSL调试golang本地进程

背景&#xff1a; windows10企业版 vscodegolang1.20 wsl编译运行。 vscode 使用本地wsl进行进程attach操作&#xff0c;发现&#xff1a;Access is denied. 本地进程启动&#xff0c;vscode调试进程。windows-Linux控制台: Starting: C:\Users\book\go\bin\dlv.exe dap --l…

微服务之qiankun主项目+子项目搭建

主项目使用history&#xff0c;子项目使用hash模式 1. 下载安装"qiankun": "^2.10.13"2. 手动调用qiankun,使用vue脚手架搭建的项目1. 主项目配置&#xff08;我使用的是手动调用乾坤&#xff0c;在指定页面显示内容&#xff09;1. 要使用的页面中引入乾坤…

【计算机】本科考研还是就业?

其实现在很多计算机专业的学生考研&#xff0c;也是无奈的选择 技术发展日新月异&#xff0c;而在本科阶段&#xff0c;大家学着落后的技术&#xff0c;出来找工作自然会碰壁。而且现在用人单位的门槛越来越高&#xff0c;学历默认研究生起步&#xff0c;面试一般都是三轮起步…

idea生成WebServices接口

文章目录 idea生成WebServices接口1.创建接口2.生成wsdl文件3.在soapUI中&#xff0c;生成6个文件4.将生成的文件拷贝到工程中5.在service-config中注册服务 idea生成WebServices接口 1.创建接口 新建一个webServices工程&#xff0c;按照接口规范生成接口、请求类、响应类。…

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

如何让网页APP化 渐进式Web应用(PWA)

前言 大家上网应该发现有的网页说可以安装对应应用&#xff0c;结果这个应用好像就是个web&#xff0c;不像是应用&#xff0c;因为这里采用了PWA相关技术。 PWA&#xff0c;全称为渐进式Web应用&#xff08;Progressive Web Apps&#xff09;&#xff0c;是一种可以提供类似…

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1. ngx_http_rewrite_module模块指令 1.1 if 指令 1.2 return 指令 1.3 set 指令 1.4 break 指令 2. rewrite 指令 3. 防盗链 3.1 实现盗链 3.2 实现防盗链 4. 实用网址 二、反向代理 1. 概述 2. 相关概念 3. 反向代理模块 4. 参数配…

读《Shape-Guided: Shape-Guided Dual-Memory Learning for 3D Anomaly Detection》

Chu Y M, Chieh L, Hsieh T I, et al. Shape-Guided Dual-Memory Learning for 3D Anomaly Detection[J]. 2023.&#xff08;为毛paperwithcode上面曾经的榜一引用却只有1&#xff09; 摘要 专家学习 无监督 第一个专家&#xff1a;局部几何&#xff0c;距离建模 第二个专家&…

Spring篇----第十二篇

系列文章目录 文章目录 系列文章目录前言一、指出在 spring aop 中 concern 和 crosscuttingconcern 的不同之处二、AOP 有哪些实现方式?三、Spring AOP and AspectJ AOP 有什么区别?四、如何理解 Spring 中的代理?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…

基于视觉识别的自动采摘机器人设计与实现

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展&#xff0c;农业生产效率与质量的提升成为重要的研究对象。其中&#xff0c;果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下&#xff0c;而且在劳…