桥接模式与适配器模式

一、共性和区别

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

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

二、桥接模式

1、函数类声明

cpp 复制代码
#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、函数定义

cpp 复制代码
#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、测试

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

三、适配器模式

1、函数声明

cpp 复制代码
#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
cpp 复制代码
#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、业务调用

cpp 复制代码
  HdmiAdapter*  adapter = new  HdmiAdapter();
  adapter->hdmiIO();

四、CMakeLists.txt

bash 复制代码
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}
)
相关推荐
AI人工智能+电脑小能手4 天前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
winfreedoms7 天前
VMware 桥接模式无法联网:从 DHCPDISCOVER 到静态 IP 的完整排障实战
网络协议·tcp/ip·ubuntu·桥接模式·vmware·嵌入式学习
AI人工智能+电脑小能手8 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
莫得感情 o14 天前
设计模式 13 · 桥接模式
java·设计模式·桥接模式
莫得感情 o16 天前
设计模式 09 · 适配器模式
设计模式·适配器模式
啦啦啦啦啦zzzz19 天前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
IT小盘1 个月前
05-企业项目统一接入多个大模型-适配器模式实战
前端·人工智能·适配器模式
jinyishu_1 个月前
模拟实现 C++ 栈和队列——从适配器模式看懂 STL 容器之美
java·c++·适配器模式
geovindu1 个月前
CSharp: Bridge Pattern
开发语言·后端·桥接模式·结构型模式
似是燕归来1 个月前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发