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();
*/