桥接模式
对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖顾关系限制了灵活性并最终限制了复用性[DP]。
合成/聚合复用原则(CARP),尽量使用合成/集合,尽量不要使用类继承。
**桥接模式(Bridge):**将抽象部分与它的实现部分分离,使它们都可以独立地变化。

AbstractionImp.h
#ifndef ABSTRACTIONIMP_H
#define ABSTRACTIONIMP_Hclass AbstractionImp {
public:virtual ~AbstractionImp() = default;virtual void Operation();AbstractionImp() = default;
};class ConcretetAbstractionImpA : public AbstractionImp {
public:ConcretetAbstractionImpA() = default;~ConcretetAbstractionImpA() override = default;void Operation() override;
};class ConcretetAbstractionImpB : public AbstractionImp {
public:ConcretetAbstractionImpB() = default;~ConcretetAbstractionImpB() override = default;void Operation() override;
};#endif //ABSTRACTIONIMP_H
AbstractionImp.cpp
#include <iostream>
#include "AbstractionImp.h"using namespace std;void AbstractionImp::Operation() {cout << "AbstractionImp....imp..." << endl;
}void ConcretetAbstractionImpA::Operation() {cout << "ConcreteAbstractionImpA...." << endl;
}void ConcretetAbstractionImpB::Operation() {cout << "ConcreteAbstractionImpB...." << endl;
}
Abstraction.h
#ifndef ABSTRACTION_H
#define ABSTRACTION_H#include "AbstractionImp.h"class Abstraction {
public:virtual ~Abstraction();virtual void Operation() = 0;
protected:Abstraction();
};class RefinedAbstraction : public Abstraction {
public:explicit RefinedAbstraction(AbstractionImp *imp);~RefinedAbstraction() override;void Operation() override;
protected:AbstractionImp *_imp;
};
#endif //ABSTRACTION_H
Abstraction.cpp
#include "abstraction.h"Abstraction::~Abstraction() = default;Abstraction::Abstraction() = default;RefinedAbstraction::RefinedAbstraction(AbstractionImp *imp) {_imp = imp;
}RefinedAbstraction::~RefinedAbstraction() = default;void RefinedAbstraction::Operation() {_imp->Operation();
}
main.cpp
#include <iostream>
#include "Abstraction.h"
#include "AbstractionImp.h"using namespace std;int main() {AbstractionImp *imp = new ConcretetAbstractionImpA();Abstraction *abs = new RefinedAbstraction(imp);abs->Operation();return 0;
}
相关文章:
桥接模式
对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题&…...
docker中mysql突然无法远程连接设置
docker登陆到docker.hub docker login -u 用户名 回车密码 将容器打包成自己的镜像 docker commit -a "用户名" -m "redis" 533d6f1402ca 用户名/myredis:v1.2 将镜像发布到平台上 docker push用户名/myredis:v1.2 删除本地镜像 docker rm image …...
Nuxt3 的生命周期和钩子函数(二)
title: Nuxt3 的生命周期和钩子函数(二) date: 2024/6/26 updated: 2024/6/26 author: cmdragon excerpt: 摘要:本文深入介绍了Nuxt.js框架中几个关键的生命周期钩子函数,包括app:redirected(SSR环境下重定向前触发…...
用英文介绍孟买:Mumbai India‘s Transforming MEGACITY
Mumbai: India’s Transforming MEGACITY Link: https://www.youtube.com/watch?vtWD_-Rzrn8o Summary First Paragraph: Mumbai, India’s financial and entertainment capital, is undergoing a major transformation. With its contiguous urban population nearing 25…...
镜像发布至dockerHub
1、login 没有账号的话去注册一个 https://hub.docker.com docker login 输入账号密码和账号2、修改镜像名格式 可以直接招我的修改 格式为你的 hub名/镜像名 3、推送...
vscode + CMake编译(opencv显示图片工程)
1.opencv 1.1Mat容器: 在OpenCV中,cv::Mat是一个重要的类,用于表示和操作矩阵或多维数组,通常用于图像处理和计算机视觉任务。 cv::Mat类具有以下特点和功能: 多维数据存储:cv::Mat可以存储多维数据&…...
JavaScript的学习之强制类型转换
目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一:调用被转化数据类型的toString()方法 方式二:调用String函数,并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一:使用Number()函数…...
天润融通:AI赋能客户体验,推动企业收入和业绩增长
“客户体验已经成为全球企业差异化的关键。人工智能与数据分析等创新技术正在加速推动企业在客户体验计划中取得成功,以保持领先地位”。Customer Insights & Analysis 研究经理Craig Simpson说道。 客户体验 (CX,Customer Experience) 是客户在与企…...
Android与服务器交互的方式中的对称加密和非对称加密(kotlin)
Android与服务器交互中的对称加密和非对称加密(kotlin) 引言 在 Android 与服务器交互时,我们常常需要进行数据传输,为了保证数据的安全性,我们可以使用加密算法来保护数据。在本文中,我们将介绍如何在 K…...
epoch和batch的区别
在机器学习和深度学习中,“epoch”(批次)和"batch"(批量)是两个重要的概念,它们分别表示训练过程中的不同阶段和数据处理方式。 Epoch(批次) 定义:Epoch&…...
非递归创建二叉查找树
非递归创建二叉查找树代码。 #include <stdio.h> #include <stdlib.h>typedef int KeyType; typedef struct BSTNode{KeyType key;struct BSTNode *lchild,*rchild; }BSTNode,*BiTree;//王道书上的递归写法,代码简单,但是理解有难度 //int …...
摄影师危!AI绘画即将降维打击摄影行业
你还以为AI绘画影响的只是插画师行业吗?错了,摄影行业也即将面临技术洗牌 话不多说,先看一下这几张图 你能一眼看出这是AI画的迪丽热巴吗? 你是不是还以为AI绘画只能画点动漫艺术风格?那你就低估了AI的发展速度&…...
ts 中class
class obj{name:stringage:numberconstructor(name:string,age:number){this.name namethis.age age}setname(){this.name 111 } } //新建实例 //构造方法中的this指向调用者,谁new就指向谁 //这个this 指向 o,打印this,可以获取到o身上的…...
深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程
1.绪论 在深度解析RocketMq源码-高可用存储组件(一) raft协议详解-CSDN博客 中讲过,raft协议中,日志同步主要有两个地方,一个是leader会跟follower同步数据,另一个是在新leader诞生的时候,会与…...
ONLYOFFICE 文档开发者版 8.1:API 更新
随着版本 8.1 新功能的发布,我们更新了编辑器、文档生成器和插件的 API,并添加了 Office API 板块。阅读下文了解详情。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写…...
Activemq单节点在Windows下的配置部署
1.环境信息 服务器信息jdk版本activemq版本备注Windows Server 2008R2 Enterprisejdk-17_windows-x64_bin.exeapache-activemq-5.18.42.jdk配置 1.下载jdk 地址: Java Downloads | Oracle 中国 2.上传至Windows服务器,点击安装,在选择安装目录页面,选择合适的安装目录即…...
SpringBoot-注解@ImportResource引入自定义spring的配置xml文件和配置类
1、注解ImportResource 我们知道Spring的配置文件是可以有很多个的,我们在web.xml中如下配置就可以引入它们: SprongBoot默认已经给我们配置好了Spring,它的内部相当于已经有一个配置文件,那么我们想要添加新的配置文件怎么办&am…...
GitLab配置免密登录之后仍然需要Git登录的解决办法
GitLab配置免密登录之后仍然需要Git登录的解决办法 因为实习工作需要,要在本地拉取gitlab上的代码,设置了密钥之后连接的时候还需要登录的token,摸索之后有了下面的解决办法。 方法一: 根据报错的提示,去网站上设置个人…...
探索小众爱好:打造个人韧性与特色之路
在这个信息爆炸的时代,我们很容易陷入“千篇一律”的漩涡中,无论是生活方式还是兴趣爱好,似乎都趋向于某种“流行”或“热门”。然而,真正的个性与魅力,往往来源于那些不为大众所知的小众爱好。今天,我想和…...
GitHub使用教程(小白版)
看一百篇文章不如自己写一篇 第一步:注册和安装 注册GitHub账号 访问 GitHub官网。点击右上角的 "Sign up" 按钮。按照提示输入你的邮箱、创建用户名和密码,完成注册。 安装Git 访问 Git官网。下载并安装适用于你操作系统的Git。安装…...
ANIMATEDIFF PRO效果展示:森林晨雾中飘落树叶+光线穿透动态GIF集
ANIMATEDIFF PRO效果展示:森林晨雾中飘落树叶光线穿透动态GIF集 1. 引言:当AI遇见电影级动态美学 想象一下,你脑海中有一个绝美的画面:清晨的森林,薄雾缭绕,阳光透过层层叠叠的树叶,形成一道道…...
MoE大模型入门指南:小白也能掌握的AI核心技术(收藏学习)
混合专家模型(Mixture-of-Experts, MoE)是机器学习和深度学习中的一种流行架构,目前被广泛应用于大模型领域。MoE的基本原理是通过门控(Gating)机制,加权集成各专家(Experts…...
Java八股文实战:从cv_resnet101模型服务理解RPC与序列化
Java八股文实战:从cv_resnet101模型服务理解RPC与序列化 你是不是也遇到过这种情况?面试时被问到“RPC和HTTP有什么区别?”、“序列化协议怎么选?”,脑子里全是书本上的概念,什么“远程过程调用”、“轻量…...
如何用WeChatMsg实现微信聊天记录的永久保存与深度分析
如何用WeChatMsg实现微信聊天记录的永久保存与深度分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...
GJK碰撞检测算法:从原理到实战的5个核心技巧
GJK碰撞检测算法:从原理到实战的5个核心技巧 【免费下载链接】gjk.c Gilbert-Johnson-Keerthi (GJK) collision detection algorithm in 200 lines of clean plain C 项目地址: https://gitcode.com/gh_mirrors/gj/gjk.c GJK碰撞检测算法是游戏开发和物理引擎…...
AIGlasses_for_navigation网络通信基础:TCP/IP协议栈与实时数据传输优化
AIGlasses_for_navigation网络通信基础:TCP/IP协议栈与实时数据传输优化 最近和几个做智能眼镜导航项目的朋友聊天,他们都在为一个问题头疼:眼镜端看到的导航画面,有时候会卡顿一下,或者指令响应慢半拍。这听起来是小…...
PostgreSQL表膨胀避坑指南:从监控到优化的完整解决方案
PostgreSQL表膨胀避坑指南:从监控到优化的完整解决方案 PostgreSQL作为一款强大的开源关系型数据库,在企业级应用中扮演着重要角色。然而,随着数据量的增长和业务复杂度的提升,表膨胀问题逐渐成为许多DBA和开发者的"隐形杀手…...
新手也能懂:用Python+TI IWR1843雷达,从ADC数据到4D点云的全流程拆解
新手也能懂:用PythonTI IWR1843雷达,从ADC数据到4D点云的全流程拆解 毫米波雷达技术正在智能驾驶、工业检测等领域掀起革命,但原始信号到点云的转换过程常让初学者望而生畏。本文将用Python代码一步步拆解TI IWR1843雷达的ADC数据处理全流程…...
如何用RecastNavigation构建完整的游戏AI导航系统:从入门到实战
如何用RecastNavigation构建完整的游戏AI导航系统:从入门到实战 【免费下载链接】recastnavigation Navigation-mesh Toolset for Games 项目地址: https://gitcode.com/gh_mirrors/re/recastnavigation 想要为你的游戏打造智能的AI导航系统吗?Re…...
突破难关:AI专著撰写工具应用技巧,助你快速著书立说
学术专著写作困境与AI工具的崛起 对许多研究人员来说,撰写学术专著最大的挑战,就是“有限的精力”与“无尽的需求”之间的矛盾。专著的写作过程通常需要三到五年,甚至更长的时间,而研究者们在日常工作中还要应对教学、研究项目和…...
