C++模板和多态设计实践

1. 需求分析和软件设计

嵌入式设备针对自身硬件有定时监测的需求,根据硬件的不同,监测周期和项目有所区别,但是监测的触发机制和流程是类似的。

通过分析,可以利用C++模板和多态的特性,设计一个监测任务基类MonitorTask,针对单个硬件的检测任务Task1~N,继承和实现MonitorTaskA。再通过一个Controller类,来管理Task任务的执行。类图如下:

 如此设计的好处:

1. 在不改变现有监测的基础上,可以灵活添加和删除新的硬件监测任务,而不影响现有的软件框架。

2. MonitorController可以统一管理全部的监测任务,也可以单独屏蔽或者执行某个task,同时不用针对每个Task编写触发逻辑,当然这也是建立在所有的任务的触发机制是相同的基础上。

2. 代码实现

基类MonitorTask以及两个子类TemperatureMonitorTask和HumidityMonitorTask。 

class MonitorTask
{
public:
    virtual bool run() = 0;
    virtual void stop() = 0;
};

class TemperatureMonitorTask : public MonitorTask
{
public:
    bool run() override
    {
        cout << "run temperature monitor" << endl;
        return false;
    }
    void stop() override
    {
        cout << "stop temperature monitor" << endl;
    }
};

class HumidityMonitorTask : public MonitorTask
{
public:
    bool run() override
    {
        cout << "run humidity monitor" << endl;

        return true;
    }
    void stop() override
    {
        cout << "stop humidity monitor" << endl;
    }
};

MonitorController 可以定义为模板类,参数为任务数量number_of_tasks。

template<size_t number_of_tasks>
class MonitorController{
public:
    MonitorController(){}
    void start_monitor(){
        current_task = 0;
    }
    bool is_done(){
        return current_task == end_of_task;
    }
    void run_task(){
        if(current_task != end_of_task){
            const bool task_done = monitor_tasks[current_task]->run();
            if(task_done){
                ++current_task;
            }
        }
    }
    void stop_monitor(){
        for(size_t i=0; i<end_of_task; ++i){
            monitor_tasks[i]->stop();
        }
    }
    void add_new_monitor_task(MonitorTask* monitor_task_cur){
        if((monitor_task_cur!=NULL) and (end_of_task < monitor_tasks.size())){
            monitor_tasks[end_of_task] = monitor_task_cur;
            end_of_task++;
        }
    }
private:
    std::array<MonitorTask*, number_of_tasks> monitor_tasks{};
    size_t current_task{};
    size_t end_of_task{};
};

 main函数,测试代码。

int main()
{
    /* 创建 controller 和 monitor task 实例 */
    MonitorController<2> monitor_controller;
    TemperatureMonitorTask temperature_monitor_task;
    HumidityMonitorTask humidity_monitor_task;

    /* add monitor task to controller */
    monitor_controller.add_new_monitor_task(&temperature_monitor_task);
    monitor_controller.add_new_monitor_task(&humidity_monitor_task);

    monitor_controller.start_monitor();
    while (not monitor_controller.is_done())
    {
        monitor_controller.run_task();
    }
    monitor_controller.stop_monitor();

    return 0;
}

程序运行结果:

3. 代码持续优化

在某些复杂的应用场景下,可以结合工厂模式来优化监测任务的创建过程。同时,使用std::map来管理监测任务,能够实现更加灵活的任务管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值