桥接模式与适配器模式

一、共性和区别

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

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

二、桥接模式

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}
)
相关推荐
morning_judger1 天前
【设计模式系列】桥接模式(十三)
java·设计模式·桥接模式
无敌岩雀2 天前
C++设计模式结构型模式———桥接模式
c++·设计模式·桥接模式
杨充4 天前
07.适配器模式设计思想
适配器模式
G皮T4 天前
【设计模式】结构型模式(一):适配器模式、装饰器模式
java·设计模式·适配器模式·装饰器模式·decorator·adapter·结构型模式
ROS机器人学习与交流4 天前
虚拟机桥接模式连不上,无法进行SSH等远程操作
桥接模式
Mr. zhihao6 天前
适配器模式适用的场景
适配器模式
小白7 天前
C# 结构型设计模式----适配器模式
设计模式·适配器模式
Mr. zhihao7 天前
适配器模式:类适配器与对象适配器
java·适配器模式
Slow菜鸟8 天前
Spring 设计模式之适配器模式
spring·设计模式·适配器模式
wrx繁星点点8 天前
桥接模式:解耦抽象与实现的利器
android·java·开发语言·jvm·spring cloud·intellij-idea·桥接模式