C++工程,C++设计模式-适配器模式

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();
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值