桥接模式与适配器模式

一、共性和区别       

      桥接设计模式和适配器设计模式的共同点和明显,它们都是使两种不同的类配合工。

       二者的区别在于,适配器模式是将已有的两个不同接口接口组合到一起,使得适配器同时拥有两个不同接口的功能,其目的是使两个不兼容的接口协调工作;桥接模式目的是抽象和实现分离,实现的改变不影响抽象,抽象的变化不影响实现,可以有效的应对具体业务的变化,以及业务实现的横向扩展。

二、桥接模式

1、函数类声明

#ifndef BRIDGE_H
#define BRIDGE_H
#include <iostream>
using namespace std;

///定义抽象业务类
class  AbstractObj{
public:
    virtual  void  abstractOpt()=0;
};

/// 定义具体业务实现类A
class  ObjImplA: public AbstractObj{
public:
     ObjImplA();
    ~ObjImplA();
    void   abstractOpt()  override;
};

/// 定义具体的业务实现了B
class  ObjImplB: public AbstractObj{
public:
    ObjImplB();
    ~ObjImplB();
    void abstractOpt()  override;
};

/// 定义桥器
class IBridge{
public:
    virtual void   bridgeOpt()=0;
};

/// 桥接器具体实现
class  BridgeImpl: public IBridge{
/// 桥接器持有对抽象业务类的引用,不考虑具体实现,这样不管具体的业务怎么处理,都不会影响到接口,随着业务的扩张,业务横向增加,对于用户是无感的,用户只需要通过桥接器动态调用即可    
private:
    AbstractObj*  abstractObj;
public:
    BridgeImpl(AbstractObj*  abstractObj);
    ~BridgeImpl();
    void bridgeOpt() override;
};

#endif 

2、函数定义

#include "./bridge.h"

ObjImplA::ObjImplA(){

}
ObjImplA::~ObjImplA(){

}
void ObjImplA::abstractOpt(){
   std::cout << "ObjImplA call  abstractOpt  function" << std::endl;
}

ObjImplB::ObjImplB(){

}
ObjImplB::~ObjImplB(){

}
void  ObjImplB::abstractOpt(){
     std::cout << "ObjImplB call  abstractOpt  function" << std::endl;
}

BridgeImpl::BridgeImpl(AbstractObj*  abstractObj){
    this->abstractObj = abstractObj ;
}

void BridgeImpl::bridgeOpt(){
    abstractObj->abstractOpt();
}

3、测试

 /// 处理B类业务
IBridge*  bridge = new BridgeImpl(new ObjImplB());
bridge->bridgeOpt();
/// 处理A类业务
bridge = new BridgeImpl(new ObjImplA());
bridge->bridgeOpt();

三、适配器模式 

 1、函数声明

#ifndef ADAPTER_H
#define ADAPTER_H
#include  <iostream>
#include <string.h>
using namespace std;

/// 场景设定,笔记本上只有HDMI接口,而手中只有一根VGA的线,要想把这个VGA得线连到笔记本,就需要一个HDMI的转接头,这就典型的适配器模式

///  定义适配者vga VAG线
class Vga{
protected:
    string vgaTran();
};

/// 定义适配接口  hdmi接口
class  IHdmi{
public:
    virtual void hdmiIO()=0;
};

/// 定义适配器 hdmi 转接头
class HdmiAdapter : public Vga,public IHdmi {
public:
    void hdmiIO()  override;
};

#endif
#include "adapter.h"

string Vga::vgaTran(){
  ///  使用vga线传输信号
  return "vga data line  tran signal";
}

void  HdmiAdapter::hdmiIO(){
  string singal = this->vgaTran();
  /// 使用hdmi接口输出vga传输的信号
  cout<< "hdmi  output : " << singal << endl;
}

2、业务调用

  HdmiAdapter*  adapter = new  HdmiAdapter();
  adapter->hdmiIO();

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(dpcode LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(dpcode main.cpp
    bridge.h
    bridge.cpp
    adapter.h
    adapter.cpp)

include(GNUInstallDirs)
install(TARGETS dpcode
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马头条-数据管理平台

目录 项目准备 验证码登录 验证码登录-流程 token 的介绍 个人信息设置和 axios 请求拦截器 axios 响应拦截器和身份验证失败 优化-axios 响应结果 发布文章-富文本编辑器 项目准备 技术&#xff1a; • 基于 Bootstrap 搭建网站标签和样式 • 集成 wangEditor 插件…

嵌入式Linux系统编程 — 6.3 kill、raise、alarm、pause函数向进程发送信号

目录 1 kill函数 1.1 kill函数介绍 1.2 示例程序 2 raise函数 2.1 raise函数介绍 2.2 示例程序 3 alarm函数 3.1 alarm函数介绍 3.2 示例程序 4 pause函数 4.1 pause函数介绍 4.2 示例程序 与 kill 命令相类似&#xff0c; Linux 系统提供了 kill()系统调用&#…

用MySQL+node+vue做一个学生信息管理系统(一):配置项目

先用npm init -y生成配置文件 在项目下新建src文件夹&#xff0c;app.js文件。src目录用来放静态资源文件&#xff0c;app.js是服务器文件&#xff0c;index.js是vue的入口文件 使用npm install express下载express框架 在app.js文件夹开启node服务&#xff0c;监听的端口为…

可视化作品集(01):工业控制领域的大屏

hello&#xff0c;大家好&#xff0c;我是威斯数据&#xff0c;本期开始按照主题来分享可视化大屏/数字孪生项目作品集&#xff0c;大家想看哪些行业的作品&#xff0c;可以在评论区留言。 可视化大屏在工业控制领域可以帮助企业实现生产过程的实时监控、故障预警、生产调度和…

【Windows】Visual Studio Installer下载缓慢解决办法

【Windows】Visual Studio Installer下载缓慢解决办法 1.背景2.分析3.结果 1.背景 使用visual studio在线安装包进行IDE安装&#xff0c;发现下载几乎停滞&#xff0c;网速几乎为零。 经过排查并不是因为实际网络带宽导致。 这里涉及DNS知识&#xff1b; DNS&#xff08;Dom…

Lua、AB包热更新总结

1.AB包热更新 &#xff08;1&#xff09;AB包是一种特定的压缩文件&#xff0c;可以放模型贴图音效等等 &#xff08;2&#xff09;Resources目录下打包时只读 无法修改&#xff1b;而AB包存储的位置是自定义的&#xff0c;能够动态更新&#xff0c;同时可以决定资源包初始的大…

红酒与舞蹈:舞动的味觉艺术

在艺术的海洋中&#xff0c;红酒与舞蹈总是能激起人们心中较温柔的涟漪。红酒以其深邃的色泽、馥郁的香气&#xff0c;诠释着味觉的艺术&#xff1b;而舞蹈&#xff0c;则以优雅的姿态、灵动的步伐&#xff0c;演绎着视觉的盛宴。当红酒遇上舞蹈&#xff0c;一场别开生面的艺术…

pycharm工具回退键调出

pycharm工具调出回退键。 View->Appearance->Toolbar,即可调出 调不出的可以使用快捷键&#xff1a;ctrlalt向左箭头 但是这个快捷键容易和电脑屏幕旋转冲突。可将电脑的快捷键关掉&#xff0c;即可。 ctrlalt向上箭头&#xff1a;将屏幕旋转到正常&#xff08;横向&am…

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo&#xff1f; 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…

svn忽略上传文件node_modules文件

文章目录 1.点击svn项目右键-》选中svn的属性2. 点击 新建3. 点击其他4. 选择属性 svn:global-ignores5. 输入忽略文件 1.点击svn项目右键-》选中svn的属性 2. 点击 新建 3. 点击其他 4. 选择属性 svn:global-ignores 5. 输入忽略文件

能在网页上快速创建Linux系统的Instantbox

什么是 Instantbox &#xff1f; Instantbox 是一个开源项目&#xff0c;旨在帮助用户在几秒钟内即可获得一个干净、随时可用的 Linux 机器。用户可以选择多种主流的的 Linux 发行版&#xff0c;目前支持 Ubuntu、CentOS、Arch Linux、Debia、Fedora、Alpine 的各个版本。软件基…

华为HCIP Datacom H12-821 卷24

1.单选题 企业大楼有大量员工通常都在上班时在大厅开始接入到公司的WLAN网络,随着每位员工走到各自的工位过程中&#xff0c;每个人的移动端叶通过漫游的方式漫游到各自的网络覆盖区域。为了尽量保证每个终端的IP地址是固定的&#xff0c;建议的做法是? A、配置VLAN Poo…

他们在闲鱼购物开通快手免密支付,支付宝被盗刷上万……

移动支付时代&#xff0c;想必大家都体验过爽到不能再爽&#xff0c;丝滑到不能再丝滑、方便到不能再方便的免密支付吧&#xff01;‍‍‍‍ 小柴前几年也一样&#xff0c;在网络平台消费支付的时候&#xff0c;只要跳出授权免密支付的提醒&#xff0c;通通同意了。 但是被各种…

vue3 在el-input的光标处插入文本

点击文本框下方的按钮&#xff0c;将相应的文本插入光标处的实现&#xff1a; <el-input type"textarea" rows"4" v-model"formula" blur"handleBlur" clearable></el-input><el-button-group class"short_btn&q…

Python28-7.1 降维算法之PCA主成分分析

降维算法是一类数据处理技术&#xff0c;主要用于将高维数据映射到低维空间中&#xff0c;从而减少数据的维度。降维不仅可以减少计算复杂度&#xff0c;提高算法性能&#xff0c;还可以帮助数据可视化。常见的降维算法包括主成分分析&#xff08;PCA&#xff09;、线性判别分析…

冒泡排序写法

正宗的冒泡排序写法&#xff1a; public class BubbleSort {public static void main(String[] args) {int[] a {4,6,5,24,3,7,1};//初始化一个最大角标变量int n a.length-1;//循环轮次for (int i0;i<n;i){//从后向前开始&#xff0c;相邻元素比较大小&#xff0c;小的元…

HTML制作一个时钟走动效果

大家好&#xff0c;今天制作一个时钟走动效果&#xff01; 先看具体效果&#xff1a; 一、以下是一个简单的时钟走动效果的实现&#xff0c;使用了HTML、JavaScript和CSS技术。 <!DOCTYPE html> <html lang"en"> <head> <meta charset"…

【Linux】生物信息学常用基本命令

wget网址用于直接从网上下载某个文件到服务器&#xff0c;当然也可以直接从网上先把东西下到本地然后用filezilla这个软件来传输到服务器上。 当遇到不会的命令时候&#xff0c;可以使用man “不会的命令”来查看这个命令的详细信息。比如我想要看看ls这个命令的详细用法&…

Linux磁盘监控小技巧

作者&#xff1a;田逸&#xff08;formyz&#xff09; 默认情况下&#xff0c;使用Nrpe插件check_disk加选项“-w”与”-c”除了输出我们想监控的磁盘分区外&#xff0c;还输出了一些形如“/dev/shm”不需要监控的项目(如下图所示)&#xff0c;倒对查看起到了一些干扰作用。 从…

解决使用monaco-editor编译器,编译器展示内容没有超过编译器高度,但是出现滚动条问题

前言&#xff1a; 最近在完成项目时&#xff0c;有使用编译器进行在线编辑的功能&#xff0c;就选用了monaco-editor编译器&#xff0c;但是实现功能之后&#xff0c;发现即使在编译器展示的内容没有超过编译器高度的情况下&#xff0c;编译器依旧存在滚动条&#xff0c;会展示…