责任链模式详解及在自动驾驶场景代码示例(c++代码实现)

责任链模式在自动驾驶场景的C++实现

模式定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将多个处理对象连接成链,请求沿链传递直到被处理。该模式特别适合需要多级数据处理的自动驾驶感知系统,可实现处理流程的动态配置和灵活扩展。


自动驾驶感知场景分析

典型的感知数据处理流程:

  1. 数据校验 → 2. 坐标系转换 → 3. 噪声过滤 → 4. 特征提取 → 5. 目标分类

我们将实现可动态配置的数据处理流水线,每级处理单元均可自主决定是否处理数据或传递给下一环节。


C++实现代码(含详细注释)

#include <iostream>
#include <memory>
#include <vector>

// ---------------------------- 数据对象 ----------------------------
// 传感器数据基类
struct SensorData {
    virtual ~SensorData() = default;
    std::string sensor_type;  // 传感器类型
    uint64_t timestamp;       // 时间戳
    bool processed = false;   // 处理状态标记
    
    virtual void printInfo() const {
        std::cout << "[" << sensor_type << "] 时间戳: " << timestamp
                  << " | 处理状态: " << (processed ? "已完成" : "未处理") 
                  << std::endl;
    }
};

// 激光雷达数据
struct LiDARData : public SensorData {
    std::vector<float> point_cloud;  // 点云数据
    
    LiDARData() { sensor_type = "LiDAR"; }

    void printInfo() const override {
        SensorData::printInfo();
        std::cout << "点云数量: " << point_cloud.size()/3 << " 个" << std::endl;
    }
};

// ---------------------------- 处理链体系 ----------------------------
// 抽象处理器接口
class DataProcessor {
protected:
    DataProcessor* next_processor = nullptr;  // 下一处理器指针

public:
    virtual ~DataProcessor() = default;

    // 设置下一处理器
    void setNext(DataProcessor* next) {
        next_processor = next;
    }

    // 处理数据(模板方法)
    void process(SensorData& data) {
        if (canHandle(data)) {
            handleData(data);
            data.processed = true;
        }

        if (next_processor != nullptr && !data.processed) {
            next_processor->process(data);
        }
    }

private:
    // 判断是否能处理(子类实现)
    virtual bool canHandle(const SensorData& data) const = 0;
    
    // 具体处理逻辑(子类实现)
    virtual void handleData(SensorData& data) = 0;
};

// 具体处理器:坐标系转换
class CoordinateTransformer : public DataProcessor {
    bool canHandle(const SensorData& data) const override {
        return data.sensor_type == "LiDAR";  // 仅处理LiDAR数据
    }

    void handleData(SensorData& data) override {
        auto& lidar_data = dynamic_cast<LiDARData&>(data);
        std::cout << "【坐标系转换】将点云转换到车辆坐标系..." << std::endl;
        // 实际工程中会进行坐标变换计算
    }
};

// 具体处理器:噪声过滤
class NoiseFilter : public DataProcessor {
private:
    float threshold = 0.1f;  // 噪声阈值

    bool canHandle(const SensorData& data) const override {
        return true;  // 所有数据都需要过滤
    }

    void handleData(SensorData& data) override {
        std::cout << "【噪声过滤】应用阈值 " << threshold 
                  << " 进行数据清洗..." << std::endl;
        // 实际工程中会执行滤波算法
    }
};

// 具体处理器:目标分类
class ObjectClassifier : public DataProcessor {
    bool canHandle(const SensorData& data) const override {
        return data.sensor_type == "LiDAR";  // 仅处理点云分类
    }

    void handleData(SensorData& data) override {
        auto& lidar_data = dynamic_cast<LiDARData&>(data);
        std::cout << "【目标分类】执行点云聚类与分类..." << std::endl;
        // 实际工程中会运行机器学习模型
    }
};

// ---------------------------- 处理链构建器 ----------------------------
class ProcessingChain {
    std::vector<std::unique_ptr<DataProcessor>> processors;

public:
    // 添加处理器(建造者模式风格)
    template<typename T, typename... Args>
    ProcessingChain& addProcessor(Args&&... args) {
        auto processor = std::make_unique<T>(std::forward<Args>(args)...);
        if (!processors.empty()) {
            processors.back()->setNext(processor.get());
        }
        processors.push_back(std::move(processor));
        return *this;
    }

    // 执行处理流程
    void execute(SensorData& data) {
        if (!processors.empty()) {
            processors.front()->process(data);
        }
    }
};

// ---------------------------- 场景演示 ----------------------------
int main() {
    // 构建处理链(可配置顺序)
    ProcessingChain chain;
    chain.addProcessor<CoordinateTransformer>()
         .addProcessor<NoiseFilter>()
         .addProcessor<ObjectClassifier>();

    // 模拟LiDAR数据
    LiDARData lidar_data;
    lidar_data.timestamp = 1678901234567;
    lidar_data.point_cloud.resize(3000);  // 1000个点(每个点xyz)

    std::cout << "=== 原始数据 ===" << std::endl;
    lidar_data.printInfo();

    // 执行处理流程
    chain.execute(lidar_data);

    std::cout << "\n=== 处理后数据 ===" << std::endl;
    lidar_data.printInfo();

    return 0;
}

代码解析

1. 数据对象设计
struct SensorData { /*...*/ };  // 抽象数据基类
struct LiDARData : public SensorData { /*...*/ };  // 具体数据类型
  • 多态支持:统一处理不同传感器数据
  • 状态跟踪processed标志防止重复处理
2. 处理器链实现
class DataProcessor { /*...*/ };  // 抽象处理器
class CoordinateTransformer : public DataProcessor { /*...*/ }; // 具体处理器
  • 处理控制canHandle()决定是否处理当前数据
  • 链式传递:通过next_processor实现请求传递
3. 链式构建优化
class ProcessingChain { /*...*/ };  // 使用建造者模式风格
  • 链式调用:支持流畅接口配置处理顺序
  • 内存管理:使用智能指针自动管理处理器生命周期

运行结果

=== 原始数据 ===
[LiDAR] 时间戳: 1678901234567 | 处理状态: 未处理
点云数量: 1000 个

【坐标系转换】将点云转换到车辆坐标系...
【噪声过滤】应用阈值 0.1 进行数据清洗...
【目标分类】执行点云聚类与分类...

=== 处理后数据 ===
[LiDAR] 时间戳: 1678901234567 | 处理状态: 已完成
点云数量: 1000 个

模式优势分析

在自动驾驶中的价值
  1. 流程可配置性

    • 动态调整处理顺序(如紧急情况优先过滤噪声)
    • 灵活替换算法实现(切换不同滤波策略)
  2. 功能解耦

    • 新增处理环节不影响现有逻辑(如增加数据加密模块)
    • 各处理器可独立测试和优化
  3. 故障隔离

    • 单个处理器故障不会导致整个系统崩溃
    • 可实现降级处理机制

扩展改进建议

1. 异步处理支持
class AsyncProcessor : public DataProcessor {
    void process(SensorData& data) override {
        std::async(std::launch::async, [&]{
            DataProcessor::process(data);
        });
    }
};
2. 优先级控制
class PriorityProcessor : public DataProcessor {
    int priority_level;
    // 比较优先级决定处理顺序
};
3. 处理监控
class MonitoringDecorator : public DataProcessor {
    void handleData(SensorData& data) override {
        auto start = std::chrono::high_resolution_clock::now();
        processor->handleData(data);
        auto duration = /* 计算耗时 */;
        reportPerformance(processor->name(), duration);
    }
};

责任链模式总结

核心价值

  • 解耦请求发送者与接收者
  • 动态配置处理流程
  • 支持分布式处理逻辑

适用场景

  • 多级数据处理的感知系统
  • 需要动态调整处理流程的自动驾驶平台
  • 需要渐进式数据增强的机器学习流水线

本实现展示了责任链模式在自动驾驶感知系统中的典型应用,通过模块化的处理单元和可配置的处理流程,为构建高可维护性的数据处理系统提供了优雅的架构解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值