(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)

目录

1、桥接模式(Bridge Pattern)含义

2、桥接模式应用场景

3、桥接模式的UML图学习

4、C++实现桥接模式的示例


1、桥接模式(Bridge Pattern)含义

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。

2、桥接模式应用场景

1)当你希望抽象部分和实现部分可以独立地扩展和变化时,可以使用桥接模式。它可以让抽象部分和实现部分可以独立地进行演化,而不会相互影响。

2)当一个类存在多个维度的变化,且每个维度都需要独立地进行扩展时,可以考虑使用桥接模式。通过将每个维度的变化抽象为不同的继承层次结构,然后通过桥接模式将这些继承层次结构连接起来,可以灵活地组合不同的变化。

3)当需要在运行时动态地选择或切换抽象部分和实现部分的关系时,可以使用桥接模式。通过将抽象部分和实现部分解耦,并通过组合的方式建立关联,可以在运行时灵活地选择具体的实现。

4)当希望对抽象部分和实现部分进行共享和复用时,可以考虑使用桥接模式。通过将抽象部分和实现部分分离,可以使它们可以独立地进行复用,从而提高代码的可维护性和可扩展性。

总的来说,桥接模式适用于抽象部分和实现部分需要独立演化、存在多个维度的变化、需要动态选择关系或希望进行共享和复用的场景。它可以提供更好的灵活性、可扩展性和可维护性。

3、桥接模式的UML图学习

 

在上述UML类图中,有以下几个关键角色:

  • Abstraction(抽象类):定义了抽象部分的接口,并包含一个指向Implementor的成员变量。它的具体子类可以通过调用Implementor的方法来实现自己的操作。

  • Implementor(实现类接口):定义了实现部分的接口,它通常只提供了一些基本的操作方法。

  • ConcreteImplementorAConcreteImplementorB(具体实现类):实现了Implementor接口,具体实现了实现部分的操作方法。

  • RefinedAbstractionARefinedAbstractionB(扩展抽象类):继承自Abstraction,并通过调用Implementor的方法来实现自己的操作。

在桥接模式中,抽象部分和实现部分通过关联关系连接在一起,而不是继承关系。这样可以使得抽象部分和实现部分可以独立地变化和演化。

4、C++实现桥接模式的示例


#include <iostream>
#include <string>// 实现接口
class Implementor 
{
public:virtual void operationImpl() const = 0;
};// 具体实现类A
class ConcreteImplementorA : public Implementor 
{
public:void operationImpl() const override {std::cout << "ConcreteImplementorA: operationImpl" << std::endl;}
};// 具体实现类B
class ConcreteImplementorB : public Implementor 
{
public:void operationImpl() const override {std::cout << "ConcreteImplementorB: operationImpl" << std::endl;}
};// 抽象类
class Abstraction {
protected:Implementor* m_implementor;public:Abstraction(Implementor* implementor) : m_implementor(implementor) {}virtual void operation() const = 0;
};// 扩展抽象类A
class RefinedAbstractionA : public Abstraction 
{
public:RefinedAbstractionA(Implementor* implementor) : Abstraction(implementor) {}void operation() const override {std::cout << "RefinedAbstractionA: ";m_implementor->operationImpl();}
};// 扩展抽象类B
class RefinedAbstractionB : public Abstraction 
{
public:RefinedAbstractionB(Implementor* implementor) : Abstraction(implementor) {}void operation() const override {std::cout << "RefinedAbstractionB: ";m_implementor->operationImpl();}
};int main() 
{// 创建具体实现类对象Implementor* implementorA = new ConcreteImplementorA();Implementor* implementorB = new ConcreteImplementorB();// 使用扩展抽象类A调用操作Abstraction* abstractionA = new RefinedAbstractionA(implementorA);abstractionA->operation();// 使用扩展抽象类B调用操作Abstraction* abstractionB = new RefinedAbstractionB(implementorB);abstractionB->operation();delete implementorA;delete implementorB;delete abstractionA;delete abstractionB;return 0;
}

在上述示例中,我们首先定义了实现接口(Implementor),其中包含了一个纯虚函数operationImpl()。然后,我们实现了两个具体的实现类(ConcreteImplementorA和ConcreteImplementorB),它们分别继承自实现接口,并实现了接口中的纯虚函数。

接着,我们定义了抽象类(Abstraction),其中包含了一个指向实现接口的指针,并声明了一个纯虚函数operation()。然后,我们通过扩展抽象类A(RefinedAbstractionA)和扩展抽象类B(RefinedAbstractionB)来实现具体的抽象类,它们分别继承自抽象类,并实现了抽象类中的纯虚函数。

在主函数中,我们创建了具体的实现类对象(implementorA和implementorB),然后通过扩展抽象类A和扩展抽象类B来调用操作。在调用操作时,实际上会调用到具体的实现类中的具体函数。

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

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

相关文章

[HDLBits] Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. //empty

在Java中对XML的简单应用

XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…

MySQL环境安装

文章目录 MySQL环境安装1. 卸载1.1 卸载不要的环境1.2 检查卸载系统安装包 2. 安装2.1 获取mysql官方yum源2.2 安装mysql的yum源2.3 安装mysql服务 3. 登录(1)(2)(3) 4. 配置my.cnf MySQL环境安装 说明&#xff1a; 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c…

Redis 搭建分片集群

文章目录 0.10.2 散列插槽0.3 集群伸缩0.3.1 需求分析0.3.1 创建新的 Redis 实例0.3.3 添加新节点到 Redis0.3.4 转移插槽 0.4 故障转移0.4.1 自动故障转移0.4.2 生动故障转移 0.5 RedisTemplate访问分片集群 1. 集群架构2. 准备实例和配置3. 启动4. 创建集群5. 测试 0.1 主从…

FreeRTOS源码分析-12 低功耗管理

目录 1 STM32低功耗管理概念及应用 1.1睡眠模式 1.2 停止模式 1.3 待机模式 2 Tickless低功耗管理 2.1 Tickless低功耗模式介绍 2.2 FreeRTOS低功耗模式配置 2.3 FreeRTOS低功耗模式应用 3 低功耗管理实际项目开发 3.1 低功耗设计必须要掌握的硬件知识 …

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…

如何加密7z压缩包?忘记密码怎么办?

7z压缩包如何设置加密&#xff1f;加密的7z压缩包又如何解密呢&#xff1f;分享7-zip加密、解密教程。 7-zip加密 右键文件选择7-zip打开压缩软件进行压缩或者在打开7-zip软件找到需要压缩的文件&#xff0c;点击添加&#xff0c;开始压缩文件 在压缩文件设置界面&#xff0…

深入理解 Vue 3 计算属性:优雅地处理响应式数据计算

计算属性的定义 在 Vue3 的 HTML 模板中是支持 JavaScript 表达式的&#xff0c;例如&#xff1a; <h2>买5个共计&#xff1a;{{ price * 5 }} 元</h2>但是如果当表达式过于复杂时&#xff0c;模板代码就会变得非常臃肿并且可读性就会变差&#xff0c;恰巧&#…

7-4 求整数均值

本题要求编写程序&#xff0c;计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出4个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中按照格式“Sum 和; Average 平均值”顺序输出和与平均值&#xff0c;其中平均值精确到小…

【MySQL】Java实现JDBC编程

文章目录 1. JDBC2. 添加驱动包3. 编程3.1 创建数据源3.2 与数据库建立连接3.3 构造SQL语句3.4 执行SQL语句3.5 释放资源&#xff0c;关闭连接 1. JDBC 数据库编程必须掌握至少一门编程语言&#xff0c;一种数据库&#xff0c;会导入数据库驱动包。 操作和连接不同数据库都需要…

09-1_Qt 5.9 C++开发指南_Qchart概述

Qt Charts 可以很方便地绘制常见的折线图、柱状图、饼图等图表&#xff0c;不用自己耗费时间和精力开发绘图组件或使用第三方组件了。 本章首先介绍 Qt Charts 的基本特点和功能&#xff0c;以画折线图为例详细说明 Qt Charts 各主要部件的操作方法&#xff0c;再介绍各种常用…

进程间的通信

进程的通信&#xff0c;光是听概念就知道这是一个非常重要的知识点&#xff0c;但是之前学习的概念其实都无法实现真正意义上的进程间的通信&#xff1a; 子进程调用exit或Exit或_exit&#xff0c;然后父进程通过wait可以知道其状态&#xff0c;这虽然实现了消息的传递&#x…