桥接模式与适配器模式

一、共性和区别

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

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

二、桥接模式

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}
)
相关推荐
客院载论2 天前
秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式
设计模式·代理模式·适配器模式
Calvin8808287 天前
Kotlin设计模式:深入理解桥接模式
设计模式·kotlin·桥接模式
L_qingting8 天前
C++ 设计模式之桥接模式
c++·设计模式·桥接模式
捕风捉你9 天前
深入理解适配器模式:Java实现与框架应用
java·开发语言·适配器模式
苟且.10 天前
设计模式之【适配器模式】
java·设计模式·适配器模式
没有理想的不伤心11 天前
适配器模式(大话设计模式)C/C++版本
c语言·设计模式·适配器模式
暮雨FH15 天前
设计模式——桥接模式
设计模式·桥接模式
暮雨FH18 天前
设计模式——适配器模式
java·设计模式·适配器模式
明戈戈19 天前
设计模式-桥接模式
java·设计模式·桥接模式