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