桥接模式与适配器模式

一、共性和区别

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

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

二、桥接模式

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}
)
相关推荐
Damon_X10 小时前
桥接模式(Bridge Pattern)
设计模式·桥接模式
犬余16 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
越甲八千3 天前
重拾设计模式-外观模式和适配器模式的异同
设计模式·适配器模式·外观模式
越甲八千3 天前
重拾设计模式--适配器模式
设计模式·适配器模式
诸葛悠闲6 天前
设计模式——适配器模式
设计模式·适配器模式
重生之绝世牛码6 天前
Java设计模式 —— 【结构型模式】桥接模式详解
java·大数据·开发语言·设计模式·桥接模式·设计原则
西岭千秋雪_6 天前
设计模式の建造者&适配器&桥接模式
java·设计模式·建造者模式·桥接模式·适配器模式
昊虹AI笔记8 天前
Vmware的网络适配器的NAT模式和桥接模式有何区别?如何给Uubunt系统添加桥接网卡?
桥接模式
huaqianzkh8 天前
桥接模式的理解和实践
java·设计模式·桥接模式
Jack_abu9 天前
设计模式学习之——适配器模式
设计模式·适配器模式