一、共性和區別? ? ? ?
? ? ? 橋接設計模式和適配器設計模式的共同點和明顯,它們都是使兩種不同的類配合工。
? ? ? ?二者的區別在于,適配器模式是將已有的兩個不同接口接口組合到一起,使得適配器同時擁有兩個不同接口的功能,其目的是使兩個不兼容的接口協調工作;橋接模式目的是抽象和實現分離,實現的改變不影響抽象,抽象的變化不影響實現,可以有效的應對具體業務的變化,以及業務實現的橫向擴展。
二、橋接模式
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}
)