C++工程,C++设计模式-策略模式


c++设计模式
策略模式是指定义一系列的算法,把它们单独封装起来,并且使它们可以互相替换,使得算法可以独立于使用它的客户端而变化,也是说这些算法所完成的功能类型是一样的,对外接口也是一样的,只是不同的策略为引起环境角色环境角色表现出不同的行为。

相比于使用大量的if…else,使用策略模式可以降低复杂度,使得代码更容易维护。

缺点:可能需要定义大量的策略类,并且这些策略类都要提供给客户端。

1,data_queue.h

#ifndef __DATA_QUEUE_H__
#define __DATA_QUEUE_H__

#include <map>

enum class QueueType : int {
    QUEUE = 1,
    ZMQ = 2,
};

//此处结构体参数要兼容不同队列的创建
//此处只做示意,需要酌情修改
struct QueueParam {
    QueueType queue_type = QueueType::QUEUE;
    int queue_size; 
    std::string queue_name;
};

class AbstractQueue {
public:
    virtual int pullData(int &number, std::vector<std::shared_ptr<int>> &record_list) = 0;
    virtual int pushData(int &number, std::vector<std::shared_ptr<int>> &record_list) = 0;
    virtual int getQueueSize(int &size) = 0;
    virtual ~AbstractQueue(){};
};

class DataQueue {
private:
    QueueType m_type;
public:
    AbstractQueue *m_queue;
public:
    DataQueue();
    DataQueue(const QueueParam &queue_param);
    ~DataQueue();
};

#endif

2,my_queue.h

#ifndef __MY_QUEUE_H__
#define __MY_QUEUE_H__

#include <queue>
#include "data_queue.h"

class MyQueue : public AbstractQueue {
private:
    std::queue<std::shared_ptr<int>> m_queue;
    int m_size;
    std::mutex m_queue_mutex;
public:
    MyQueue();
    MyQueue(int queue_size);
    ~BdavsQueue();
    int pullData(int &number, std::vector<std::shared_ptr<int>> &record_list);
    int pushData(int &number, std::vector<std::shared_ptr<int>> &record_list);
    int getQueueSize(int &size);
};
#endif

2,my_zmq.h

#ifndef __MY_ZMQ_H__
#define __MY_ZMQ_H__

#include <zmq.h>
#include "data_queue.h"

class MyZmq : public AbstractQueue {
private:
	//zmq的具体实现方式和相应的成员变量

    std::mutex m_queue_mutex;
public:
    MyZmq();
    MyZmq(int queue_size, string queue_name);
    ~MyZmq();
    int pullData(int &number, std::vector<std::shared_ptr<int>> &record_list);
    int pushData(int &number, std::vector<std::shared_ptr<int>> &record_list);
    int getQueueSize(int &size);
};
#endif

3,data_queue.cpp

#include "data_queue.h"
#include "my_queue.h"
#include "my_zmq.h"

namespace bdavs {
    namespace eyeofgod {

        DataQueue::DataQueue() {
        }

        DataQueue::DataQueue(const QueueParam &queue_param) {
            m_type = queue_param.queue_type;
            if(m_type == QueueType::QUEUE) {
                m_queue = (AbstractQueue *)new MyQueue(queue_param.queue_size);
                LOG(INFO) << "DataQueue struct successful. typr: queue   name:" << queue_param.queue_name;
            }
            else if(m_type == QueueType::ZMQ) {
                m_queue = (AbstractQueue *)new MyZmq(queue_param.queue_size, queue_param.queue_name);
                LOG(INFO) << "DataQueue struct successful. typr: zmq   name:" << queue_param.queue_name;
            }
            else {
                LOG(ERROR) << "error queue type!";
            }
        }

        DataQueue::~DataQueue() {
            delete m_queue;
        }
    }
}

4,main.cpp

#include "data_queue.h"

int main()
{
    QueueParam queue_param;
    queue_param.queue_type = QueueType::QUEUE;
    queue_param.queue_size = 30;
    queue_param.queue_name = "first_queue";
    
    DataQueue data_queue(queue_param);
    std::vector<int> int_in = {1, 2, 3, 4};
    data_queue->m_queue.pushData(4, int_in);
    
    std::vector<int> int_out;
    int out_num;
    data_queue->m_queue.pullhData(out_num, int_out);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值