C++设计模式----桥接模式

1、介绍

        桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结构,并通过桥接类将它们连接起来。
        在桥接模式中,有两个重要的概念:抽象化(Abstraction)和实现化(Implementation),它们分别对应了系统的抽象部分和实现部分。抽象化负责定义接口,并维护一个指向实现化对象的指针;实现化则负责定义具体的实现方法

桥接模式详解:
(1)角色定义:

        Abstraction(抽象化角色):定义抽象接口,维护一个对Implementor对象的引用。
        RefinedAbstraction(具体抽象化角色):是Abstraction的一个子类,对Abstraction接口进行一些补充。
        Implementor(实现化角色):定义实现化角色的接口,任何Abstraction角色可以调用。
        ConcreteImplementor(具体实现化角色):Implementor接口的具体实现。
(2)工作原理

        抽象化角色持有实现化角色的引用,它只需要定义与客户端的接口并委托给实现化角色来执行。
        具体化角色继承抽象化角色并实现自己的业务逻辑,同时构造时关联相应的实现化角色。

应用场景:

(1)图形界面库

        图形界面库通常提供一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。桥接模式可以将界面元素和绘制方式解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“UIElement”,它包含一个指向“Graphics”类的指针。通过调用“Graphics”类的绘制方法,可以绘制不同的界面元素,而不影响界面元素本身的定义。

(2)操作系统文件系统

        文件系统需要支持多种存储介质(如磁盘、光盘、网络存储等)和多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型解耦,使得它们可以独立地变化。

        在Windows操作系统中,可以定义一个抽象类“File”,它包含一个指向“Storage”类和“FileSystem”类的指针。通过调用“Storage”类的读写方法和“FileSystem”类的文件操作方法,可以完成文件的读写和操作。

(3)游戏开发中的人物角色

        在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等),同时人物角色还可以使用多种不同的武器和装备(如剑、弓、盾等)。桥接模式可以将属性和技能解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“Character”,它包含一个指向“Attribute”类和“Skill”类的指针。通过调用“Attribute”类的方法和“Skill”类的方法,可以处理人物角色的属性和技能。

(4)网络通信框架

        在网络通信框架中,抽象接口可以定义诸如发送消息、接收消息等功能,而具体实现可以包括TCP、UDP、WebSocket等多种协议。桥接模式允许上层应用只关注消息的发送和接收逻辑,而无需关心底层通信协议的具体实现。

(5)多语言本地化

        在国际化应用中,桥接模式可以将界面的逻辑(如按钮、标签、提示信息等)与具体语言环境(如英文、中文、法文等)分离。通过桥接模式,可以在切换不同语言环境时,仅替换具体的本地化实现,而无需修改界面的逻辑部分。

2、示例

#include <iostream>/**************************************************************************************/
// 实现化接口
class RoleImpl {  
public:  virtual ~RoleImpl() = default;  virtual void attack() = 0;  // 攻击行为  virtual void defend() = 0;  // 防御行为  // ... 其他与内部实现相关的操作  
};// 具体实现化---战士
class WarriorImpl : public RoleImpl {  
public:  void attack() override {  std::cout << "Warrior attacks with sword!" << std::endl;  }  void defend() override {  std::cout << "Warrior blocks with shield!" << std::endl;  }  // ... 其他方法  
};
/**************************************************************************************//**************************************************************************************/
// 抽象化游戏角色
class Role {  
protected:RoleImpl* impl_;              // 内部实现的指针【包含一个实现化接口类对象指针】
public:  // 构造函数Role(RoleImpl* impl) : impl_(impl) {}// 析构函数virtual ~Role(){delete impl_;}virtual void display() = 0;   // 显示角色外观  virtual void fight() = 0;     // 角色战斗,通过内部实现执行  // ... 其他与外观相关的操作  
};// 具体化游戏角色---战士
class WarriorRole : public Role {  
public:  WarriorRole(RoleImpl* impl) : Role(impl) {}  void display() override {  std::cout << "Warrior is ready for battle!" << std::endl;  // ... 其他与战士外观相关的操作  }  void fight() override {  impl_->attack(); // 调用内部实现的攻击方法  // ... 其他与战士战斗相关的操作  }  // ... 其他方法  
};  
/**************************************************************************************/int main() {  RoleImpl* warriorImpl = new WarriorImpl();         // 创建战士的内部实现  Role* warriorRole = new WarriorRole(warriorImpl);  // 创建战士的外观,并关联内部实现  warriorRole->display();    // 显示战士的外观  warriorRole->fight();      // 战士战斗,执行内部实现的攻击方法  // ... 类似地创建和组合法师、弓箭手等角色  delete warriorRole;  return 0;  
}

结果:

Warrior is ready for battle!
Warrior attacks with sword!

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

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

相关文章

LogicFlow 学习笔记—7. LogicFlow 基础 背景 Background

背景 Background 提供可以修改画布背景的方法&#xff0c;包括背景颜色或背景图片&#xff0c;背景层位于画布的最底层。 info 创建画布时&#xff0c;通过 background 选项来设置画布的背景层样式&#xff0c;支持透传任何样式属性到背景层。默认值为 false 表示没有背景。 …

SAP Web IDE 安装使用

For training SAP Web IDE 是基于 Eclipse 内核的在线开发 IDE&#xff0c;可以使用在线的试用版本&#xff0c;但服务器在德国&#xff0c;访问的网速特别慢。也可以使用 Personal Edition&#xff0c;在本机启动和编写代码。 打开官网下载WEBIDE工具包&#xff0c;包含 Tri…

开源AGV调度系统OpenTCS中的路由器(router)详解

OpenTCS中的任务分派器router详解 1. 引言2. 路由器(router)2.1 代价计算函数&#xff08;Cost functions&#xff09;2.2 2.1 Routing groups2.1 默认的停车位置选择2.2 可选停车位置属性2.3 默认的充电位置选择2.4 即时运输订单分配 3. 默认任务分派器的配置项4. 参考资料与源…

C#——析构函数详情

析构函数 C# 中的析构函数&#xff08;也被称作“终结器”&#xff09;同样是类中的一个特殊成员函数&#xff0c;主要用于在垃圾回收器回收类实例时执行一些必要的清理操作。 析构函数: 当一个对象被释放的时候执行 C# 中的析构函数具有以下特点&#xff1a; * 析构函数只…

简单了解RS485与RS232(UART)

简单了解RS485与RS232&#xff08;UART&#xff09; 一、UART和RS232、RS485的关系1、UART2、RS232/RS4853、RS232 与 RS485 的区别与联系 二、Modbus协议说明1、什么是协议2、Modbus协议说明3、Modebus通信过程4、Modbus存储区5、Modbus协议类型6、Modbus功能码 三、stm32HC-S…

短视频压缩与编码技术在短剧APP小程序开发中的应用:技术选择与工具推荐

在短剧APP小程序开发中&#xff0c;选择合适的短视频压缩与编码技术及工具对于实现高效的视频处理至关重要。本文将探讨如何选择合适的技术和工具&#xff0c;以及推荐一些在实际开发中常用的解决方案。 技术选择的原则 平衡压缩率与视频质量&#xff1a;在选择压缩技术时&…

flutter开发实战-RichText富文本居中对齐

flutter开发实战-RichText富文本居中对齐 在开发过程中&#xff0c;经常会使用到RichText&#xff0c;当使用RichText时候&#xff0c;不同文本字体大小默认没有居中对齐。这里记录一下设置过程。 一、使用RichText 我这里使用RichText设置不同字体大小的文本 Container(de…

Kimichat使用案例013:用kimichat批量识别出图片版PDF文件中的文字内容

文章目录 一、介绍二、具体操作三、信息识别一、介绍 图片版的PDF文件,怎么才能借助AI工具来提取其中全部的文字内容呢? 第一步:将PDF文件转换成图片格式 具体方法参见文章: Kimichat使用案例011:用kimichat将PDF自动批量分割成多个图片(零代码编程) 第二步:识别图片中…

IEC61850 调试工具 工程师必备

文章目录 IEC61850 调试工具 工程师必备主要功能软件截图 IEC61850 调试工具 工程师必备 下载地址&#xff1a;http://www.redisant.cn/iec61850client IEC 61850 是国际电工委员会&#xff08;IEC&#xff09;制定的一项国际标准&#xff0c;主要用于电力系统自动化领域&…

AI引领项目管理新时代:效率与智能并驾齐驱

在数字化浪潮的推动下&#xff0c;项目管理领域正迎来一场由AI技术引领的革新。从自动化任务执行到智能决策支持&#xff0c;AI技术的应用正让项目管理变得更加高效、精准和智能化。本文将探讨项目管理人员及其实施团队如何运用AI技术&#xff0c;以及这些技术如何助力项目管理…

vue3 前端验证码-删除最后一个,焦点聚焦在前一个值上,并不会删除值

删除最后一个数字&#xff0c;焦点聚焦在前一个值上&#xff0c;并不会删除值 <inputv-for"(box, index) in boxes":key"index"ref"inputRefs":value"box"input"onInputChange(index)"keyup"onKeyDown($event, inde…

2、给出五种并行计算机体系结构的名称,并分别画出其典型结构。

①并行向量处理机&#xff08;PVP&#xff09; ②对称多机系统&#xff08;SMP&#xff09; ③大规模并行处理机&#xff08;MPP&#xff09; ④分布式共享存储器多机系统&#xff08;DSM&#xff09; ⑤工作站机群&#xff08;COW&#xff09;

Cargo 教程

Cargo 教程 1. 引言 Cargo 是 Rust 编程语言的包管理器和构建工具。它为 Rust 项目提供了依赖管理、编译和打包等功能。本教程将详细介绍 Cargo 的基本用法,帮助您快速上手 Rust 项目开发。 2. 安装 Cargo 在开始使用 Cargo 之前,您需要确保已经安装了 Rust 编程语言。Ru…

晶振的匹配电容的计算

晶振 等效电路 C0是晶振的静态电容 L1是晶振的等效电感 C1是晶振的等效电容 R1是晶振的等效串联电阻 芯片内部已有反相器和负载电阻 计算公式 参考1 参考2

Linux知识整理说明

最近学校Linux课程刚刚结课&#xff0c;但还是有其他课程在继续。 所以接下来我会抽时间&#xff0c;根据笔记以及网络资料&#xff0c;整理和Linux相关的知识文档&#xff0c;各位可以后续留意. 完整的章目录我会先发出来&#xff0c;后续补充完整。 所有的内容会在 下周三(6…

文件操作(总)

1.为什么使用文件 a是内存上的一块区域 如果程序退出&#xff0c;则内存回收&#xff0c;数据丢失了&#xff0c;再次运行就看不到上次的数据了 为了持久化保存&#xff0c;我们可以使用文件 2.文件是什么 磁盘上的文件是文件 在程序设计中&#xff0c;文件有两种&#xff…

NLP入门——基于TF-IDF算法的应用

从json格式数据中抽出句子和标签 首先查看json格式的数据文件&#xff1a; :~/nlp/tnews/src$ less train.json可以看到json字符串表示一个对象&#xff0c;我们利用json.loads() 函数会将其转换为一个 Python 字典。docs python json #ext.py #encoding: utf-8import sys f…

String[] 转ArrayList<String>

这种方式会将数组转换为一个固定大小的列表&#xff0c;虽然可以直接转换为ArrayList&#xff0c;但是这个列表是基于原数组的一个视图&#xff0c;对视图的更改会反映到原数组中&#xff0c;反之亦然。如果需要独立于原数组操作&#xff0c;请使用下面的方法。 使用循环添加&…

百度之星2024题目记录

目录 1 介绍2 训练-钻石level3 参考 1 介绍 本博客记录百度之星2024编程比赛相关题目。 2 训练-钻石level 题目1&#xff1a;BD202401补给 解题思路&#xff1a;排序贪心。优惠到最后购买不了任何商品时才使用。 C代码如下&#xff0c; #include<bits/stdc.h> usin…

【并集查找】839. 相似字符串组

本文涉及知识点 并集查找&#xff08;并差集) 图论知识汇总 LeetCode839. 相似字符串组 如果交换字符串 X 中的两个不同位置的字母&#xff0c;使得它和字符串 Y 相等&#xff0c;那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的&#xff0c;那它们也是相似的。…