(二)结构型模式: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.rhkb.cn/news/85009.html

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

相关文章

【算法】逆波兰表达式

文章目录 定义求法代码思想&#xff1a; 定义 逆波兰表达式也称为“后缀表达式”&#xff0c;是将运算符写在操作数之后的运算式。 求法 *如&#xff1a;(ab)c-(ab)/e的转换过程&#xff1a; 先加上所有的括号。 (((ab)*c)-((ab)/e))将所有的运算符移到括号外面 (((ab) c)* …

A33 QT 主线例程 opengl

点击查看 HW33-050 HW33-070 规格书 HW33-050 HW33-070 支持 android 系统和 Linux QT。 HW33-XXX采用4 核Cortex-A7 ARM、Mali400MP2 GPU架构&#xff0c;主频 1.2GHz 的 CPU。内存 存储标配分别为1GB、8GB&#xff0c;内置显卡为Mali400MP2&#xff0c;支持 H.264 1080P …

2023一带一路东盟工商领袖峰会在曼谷成功举行,发明家周初材被授予中泰友好交流大使

今年是共建“一带一路”倡议提出十周年。十年来&#xff0c;共建“一带一路”倡议从理念到行动&#xff0c;从愿景到现实&#xff0c;开展更大范围、更高水平、更深层次的区域合作&#xff0c;致力于维护全球自由贸易体系和开放型世界经济&#xff0c;推动文明交流互鉴&#xf…

uniapp input输入框placeholder文本右对齐

input输入框placeholder文本右对齐 给input标签加上placeholder-class&#xff0c;这个是给placeholder设置样式&#xff0c;右对齐这就是text-align:right;字体颜色之类依次编辑即可。

资讯速递 | ArkUI-X 预览版已正式开源!

OpenHarmony项目群技术指导委员会&#xff08;以下简称“TSC”&#xff09;-跨平台应用开发框架TSG所孵化项目 —— ArkUI-X&#xff0c;近期已正式开源 &#xff0c;开发者基于一套主代码&#xff0c;就可以将在OpenHarmony上开发的精美、高性能应用同时运行在Android、iOS等其…

物联网与5G引领智慧城市时代的到来

智慧城市需要依赖于多种技术&#xff0c;这些技术的应用将城市转变为高效、智能、可持续发展的现代化城市。智慧城市是基于信息技术、物联网和大数据等先进技术的融合&#xff0c;旨在提升城市的运行效率、资源利用效率和居民生活质量。以下是智慧城市需要依赖的主要技术&#…

opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsi…

【JavaEE基础学习打卡02】是时候了解JavaEE了

目录 前言一、为什么要学习JavaEE二、JavaEE规范介绍1.什么是规范&#xff1f;2.什么是JavaEE规范&#xff1f;3.JavaEE版本 三、JavaEE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天…

如何在docker部署一个python项目

导语&#xff1a; 我之前已经实现了在服务器上直接部署一个文件&#xff0c;但是那种部署方式有个明显的缺陷&#xff1a;我如果需要在其他机器部署该项目时&#xff0c;需要重新配置项目所依赖的环境。因此我们需要一种只需要配置一次环境依赖&#xff0c;就可以在其他机器上随…

竞赛项目 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

Flv格式视频怎么转MP4?视频格式转换方法分享

FLV格式的视频是一种早期的视频格式&#xff0c;不支持更高的分辨率和比特率&#xff0c;这意味着视频的清晰度和质量受限制&#xff0c;无法很好地保留细节和质量&#xff0c;这种格式的视频已经逐渐被更高质量的视频格式所替代&#xff0c;例如MP4格式&#xff0c;不仅具有很…

网络安全 Day29-运维安全项目-iptables防火墙

iptables防火墙 1. 防火墙概述2. 防火墙2.1 防火墙种类及使用说明2.2 必须熟悉的名词2.3 iptables 执行过程※※※※※2.4 表与链※※※※※2.4.1 简介2.4.2 每个表说明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 环境准备及命令2.6 案例01&#xff1a…

springboot+mybatis实现简单的增、删、查、改

这篇文章主要针对java初学者&#xff0c;详细介绍怎么创建一个基本的springboot项目来对数据库进行crud操作。 目录 第一步&#xff1a;准备数据库 第二步&#xff1a;创建springboot项目 方法1&#xff1a;通过spring官网的spring initilizer创建springboot项目 方法2&am…

K8S系列文章 之 容器网络基础 Docker0

什么是Docker0 使用ip addr命令看一下网卡&#xff1a; rootKitDevVps:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host…

SpringWeb项目核心功能总结

SpringWeb项目核心功能总结 文章目录 SpringWeb项目核心功能总结1.浏览器与Java程序的连接&#xff08;个人偏好使用RequestMapping&#xff09;2.参数的传入3.结果的返回请求转发和请求重定向的区别 核心功能用到的注解&#xff1a; RestControllerControllerResponseBodyRequ…

前端主题切换方案——CSS变量

前言 主题切换是前端开发中老生常谈的问题&#xff0c;本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时&#xff0c;为了避免代码冗余&#xff0c;降低维护成本&#xff0c;一些CSS预编译工具&#xff08;Sass/Less/Stylus&#xff09;等都支…

AP2915DC-DC降压恒流驱动IC LED电源驱动芯片 汽车摩托电动车灯

AP2915 是一款可以一路灯串切换两路灯串的降压 恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功 率管输出功率可达 12W&#xff0c;电流 1.2A。 AP2915 一路灯亮切换两路灯亮&#xff0c;其中一路灯亮可 以全亮&a…

YOLOv5、YOLOv8改进:添加ShuffleAttention注意力机制

广泛应用的注意力机制主要有空间注意力机制和通道注意力机制&#xff0c;其目的分别是捕捉像素级的成对关系和通道依赖关系。虽然将两种机制融合在一起可以获得比单独更好的性能&#xff0c;但计算开销不可避免。因而&#xff0c;本文提出Shuffle Attetion&#xff0c;即SA&…

标准化归一化 batch norm, layer norm, group norm, instance norm

Layer Normalization - EXPLAINED (in Transformer Neural Networks) Layer Normalization - EXPLAINED (in Transformer Neural Networks) 0~4min:什么是multi-head attention 5~7min:layer norm图示 7~9min:公式举例layer norm 9:54-end:layer norm的代码示例 group n…

atx2环境搭建

1. 卸载python3.11.4版本 $sudo rm -rf /Library/Frameworks/Python.framework/Versions/3.11/ $sudo rm -rf /Applications/Python\ 3.11/ 第三步&#xff1a;删除指向python的链接 cd /usr/local/bin/ ls -l /usr/local/bin | grep /Library/Frameworks/Python.framework/…