责任链模式通过抽象处理器接口解耦请求发送者与接收者,定义handle()和setNext()纯虚函数,并提供passToNext()默认实现;BaseHandler基类封装next_指针与链式跳转逻辑;具体子类专注自身业务逻辑;链由客户端显式构建;上下文采用轻量值语义设计。

一、定义抽象处理器接口
责任链模式的核心在于将请求的发送者与接收者解耦,通过定义统一的处理器接口,使各具体处理器具备可替换性和可扩展性。该接口需声明处理方法及设置后继处理器的方法。
1、声明纯虚函数 handle(),接受一个通用参数(如 std::any 或自定义上下文类),返回 bool 表示是否已处理完毕。
2、声明纯虚函数 setNext(),接收指向同一接口类型的智能指针,用于构建链式结构。
3、在接口中提供默认实现的 passToNext() 辅助方法:若 next_ 非空且当前未处理,则调用 next_->handle()。
二、实现基础处理器基类
为减少重复代码,创建一个模板基类 BaseHandler,继承自抽象接口,并持有 std::shared_ptr
1、在构造函数中初始化 next_ 为 nullptr。
2、实现 setNext() 方法,直接赋值 next_ = next。
3、实现 passToNext() 方法,检查 next_ 是否存在,若存在则返回 next_->handle(context),否则返回 false。
4、将 handle() 留作纯虚函数,强制子类实现具体业务逻辑。
三、编写具体处理器子类
每个子类代表链中的一个职责节点,仅关注自身条件判断与处理动作,不感知其他节点的存在。例如 AuthHandler 检查权限,LogHandler 记录日志,ValidationHandler 校验数据格式。
1、继承 BaseHandler
2、重写 handle():先判断是否满足本节点处理条件,若满足则执行业务并返回 true;否则调用 passToNext(context) 返回结果。
3、确保每个子类不主动调用 next_->handle(),仅通过 passToNext() 统一转发,保障链式行为一致性。
四、构建运行时处理器链
链的组装应在客户端代码中显式完成,避免硬编码依赖,支持动态插入、移除或重排节点。推荐使用工厂函数或配置驱动方式初始化链。
1、按执行顺序依次创建各个处理器实例,例如 auto auth = std::make_shared
2、调用 setNext() 连接节点:auth->setNext(log); log->setNext(validation); validation->setNext(nullptr)。
3、将链首节点(如 auth)保存为入口句柄,后续所有请求均从此处发起 handle() 调用。
五、设计轻量级上下文对象
为避免频繁拷贝和类型擦除开销,上下文应采用值语义小对象设计,成员限定为 POD 类型或轻量引用(如 std::string_view、const char*)。不引入虚函数或动态内存分配。
1、定义结构体 RequestContext,包含 request_id、user_role、payload_size 等只读字段。
2、禁止在上下文中存储 std::shared_ptr 或 std::unique_ptr 等管理资源的对象。
3、若需扩展字段,使用 std::optional
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











