模式定义
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将多个处理对象连接成链,请求沿链传递直到被处理。该模式特别适合需要多级数据处理的自动驾驶感知系统,可实现处理流程的动态配置和灵活扩展。
自动驾驶感知场景分析
典型的感知数据处理流程:
- 数据校验 → 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. 异步处理支持
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);
}
};
责任链模式总结
核心价值:
- 解耦请求发送者与接收者
- 动态配置处理流程
- 支持分布式处理逻辑
适用场景:
- 多级数据处理的感知系统
- 需要动态调整处理流程的自动驾驶平台
- 需要渐进式数据增强的机器学习流水线
本实现展示了责任链模式在自动驾驶感知系统中的典型应用,通过模块化的处理单元和可配置的处理流程,为构建高可维护性的数据处理系统提供了优雅的架构解决方案。
责任链模式在自动驾驶场景的C++实现
172

被折叠的 条评论
为什么被折叠?



