一、共性和区别
桥接设计模式和适配器设计模式的共同点和明显,它们都是使两种不同的类配合工。
二者的区别在于,适配器模式是将已有的两个不同接口接口组合到一起,使得适配器同时拥有两个不同接口的功能,其目的是使两个不兼容的接口协调工作;桥接模式目的是抽象和实现分离,实现的改变不影响抽象,抽象的变化不影响实现,可以有效的应对具体业务的变化,以及业务实现的横向扩展。
二、桥接模式
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.cppbridge.hbridge.cppadapter.hadapter.cpp)include(GNUInstallDirs)
install(TARGETS dpcodeLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)