c++設計模式
適配器模式可以將一個類的接口轉換成客戶端希望的另一個接口,使得原來由於接口不兼容而不能在一起工作的那些類可以在一起工作。通俗的講就是當我們已經有了一些類,而這些類不能滿足新的需求,此時就可以考慮是否能將現有的類適配成可以滿足新需求的類。適配器類需要繼承或依賴已有的類,實現想要的目標接口。
缺點:過多地使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構
1,interface.h
此處已經定義好了項目中要調用的算法接口
#ifndef __INTERFACE_H__
#define __INTERFACE_H__
typedef struct {
//數據成員
} KeyFrameParas;
typedef struct {
//數據成員
} KeyObjectGPU;
typedef struct {
//數據成員
} KeyObjectCPU;
typedef std::vector<KeyObjectGPU> KeyObjectGPUs;
typedef std::vector<KeyObjectCPU> KeyObjectCPUs;
typedef std::vector<KeyObjectGPUs> KeyInputGPUArray;
typedef std::vector<KeyObjectCPUs> KeyInputCPUArray;
typedef std::vector<KeyObjectGPUs> KeyOutputGPUArray;
typedef std::vector<KeyObjectCPUs> KeyOutputCPUArray;
class KeyFrame{
public:
bool init(const std::string& model_dir, const KeyFrameParas& pas, const int gpu_id);
bool inference(const KeyInputGPUArray& inputs, KeyOutputGPUArray& results);
bool inference(const KeyInputCPUArray& inputs, KeyOutputCPUArray& results);
bool releaseGPUData(KeyOutputGPUArray &results);
void release();
private:
void * keyframePtr;
};
#endif
2,multi_camera_keyfram.h
此處是算法人員的具體算法實現的調用接口
此處省略了相應的cpp文件,等一系列算法實現文件
#ifndef _MULTI_CARMERA_KEY_FRAME_H_
#define _MULTI_CARMERA_KEY_FRAME_H_
#include <iostream>
#include <vector>
#include <map>
#include "interface.h"
//其餘相關頭文件
class MultiCarmeraKeyFrame{
private:
std::map<std::string, std::shared_ptr<AbstractKeyFrame>> uuid_tracker_map;
std::string model_dir;
byavs::KeyFrameParas param;
GPUDataSingleDevice *m_gpu_data_single_device;
int gpu_id;
public:
bool init(const std::string& model_dir, const KeyFrameParas& pas, const int gpu_id);
bool inference(KeyInputGPUArray& inputs, KeyOutputGPUArray& resultArray);
bool inference(KeyInputCPUArray& inputs, KeyOutputCPUArray& resultArray);
bool releaseGPUData(KeyOutputGPUArray &results);
void release();
};
#endif
2,key_fram.cpp
此處做了接口適配,將算法人員的具體算法實現,適配到我們定義的interface接口上
#include <iostream>
#include "multi_camera_keyframe.h"
#include "interface.h.h"
using namespace byavs;
bool KeyFrame::init(const std::string& model_dir,const KeyFrameParas& pas,const int gpu_id){
MultiCarmeraKeyFrame* keyframe_model = (new MultiCarmeraKeyFrame());
keyframe_model->init(model_dir, pas, gpu_id);
keyframePtr=(void*)keyframe_model;
return true;
}
bool KeyFrame::inference(KeyInputGPUArray& inputs, KeyOutputGPUArray& resultArray){
MultiCarmeraKeyFrame* keyframe_model = (MultiCarmeraKeyFrame*)keyframePtr;
return keyframe_model->inference(inputs, resultArray);
}
bool KeyFrame::inference(KeyInputCPUArray& inputs, KeyOutputCPUArray& resultArray){
MultiCarmeraKeyFrame* keyframe_model = (MultiCarmeraKeyFrame*)keyframePtr;
return keyframe_model->inference(inputs, resultArray);
}
bool KeyFrame::releaseGPUData(KeyOutputGPUArray &results){
MultiCarmeraKeyFrame* keyframe_model = (MultiCarmeraKeyFrame*)keyframePtr;
return keyframe_model->releaseGPUData(results);
}
void KeyFrame::release(){
if(keyframePtr != NULL){
MultiCarmeraKeyFrame* keyframe_model = (MultiCarmeraKeyFrame*)keyframePtr;
delete keyframe_model;
}
}
3,使用,main.cpp
直接調用interface定義好的接口
#include "interface.h"
KeyFrame keyframe;
KeyFrameParas keyframe_param;
...
keyframe.init(model_dir,keyframe_param,gpu_id);
KeyInputGPUArray gpu_keyframe_array;
KeyOutputGPUArray gpu_keyframe_result;
keyframe.inference(gpu_keyframe_array, gpu_keyframe_result);
...
keyframe.releaseGPUData(gpu_keyframe_result);
/*
KeyInputCPUArray cpu_keyframe_array;
keyOutputCPUArray cpu_keyframe_result;
keyframe.inference(cpu_keyframe_array, cpu_keyframe_result);
...
keyframe.release();
*/