当前位置:网站首页>责任链模式(Chain Of Responsibility)
责任链模式(Chain Of Responsibility)
2022-08-02 06:54:00 【baboon_chen】
参考:
design-patterns-cpp/Proxy.cpp at master · JakubVojvoda/design-patterns-cpp · GitHub
一、什么是责任链模式?
定义:将用户的请求,通过拆解,传递给多处理者按顺序处理。它们有相同的输入,且每个处理者中都包含下一个处理者对象(最后一个处理者可以没有后继),像链表一样有者先后顺序。这样,可以通过调整链表的结构来改变请求的处理流程。
比如,员工报销需要找组长、经理、部长、账务行签字,特殊时期想简化报销流程,可以去除组长、经理等审批环节;或者审批到经理就没有通过,也就不需要走后续流程。甚至还可以添加其它审批环节,但要求所有的审批者都有相同的输入,就是审批单。
二、实现
责任链(Chain Of Responsibility)模式包含以下主要角色:
- 处理者 (Handler):声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
- 基础处理者 (Base Handler):是一个可选的类, 你可以将所有处理者共用的样本代码放置在其中。
通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。- 具体处理者 (Concrete Handlers):包含处理请求的实际代码。 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。
处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。
/*
* C++ Design Patterns: Chain of Responsibility
* Author: Jakub Vojvoda [github.com/JakubVojvoda]
* 2016
*
* Source code is licensed under MIT License
* (for more details see LICENSE)
*
*/
#include <iostream>
/*
* 处理者 (Handler):声明了所有具体处理者的通用接口。
* 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法
*/
class Handler
{
public:
virtual ~Handler() {}
virtual void setHandler( Handler *s )
{
successor = s;
}
virtual void handleRequest()
{
if (successor != 0)
{
successor->handleRequest();
}
}
// ...
private:
Handler *successor;
};
/*
* 具体处理者 (Concrete Handlers):包含处理请求的实际代码。
* 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。
*/
class ConcreteHandler1 : public Handler
{
public:
~ConcreteHandler1() {}
bool canHandle()
{
// ...
return false;
}
virtual void handleRequest()
{
if ( canHandle() )
{
std::cout << "Handled by Concrete Handler 1" << std::endl;
}
else
{
std::cout << "Cannot be handled by Handler 1" << std::endl;
Handler::handleRequest();
}
// ...
}
// ...
};
class ConcreteHandler2 : public Handler
{
public:
~ConcreteHandler2() {}
bool canHandle()
{
// ...
return true;
}
virtual void handleRequest()
{
if ( canHandle() )
{
std::cout << "Handled by Handler 2" << std::endl;
}
else
{
std::cout << "Cannot be handled by Handler 2" << std::endl;
Handler::handleRequest();
}
// ...
}
// ...
};
int main()
{
ConcreteHandler1 handler1;
ConcreteHandler2 handler2;
handler1.setHandler( &handler2 );
handler1.handleRequest();
return 0;
}
三、优缺点
优点
- 与链表一样,方便添加、删除、调整处理顺序。
- 每个处理者可以选择,是否将请求继续传递下去。
缺点
- 所有的处理者都需要实现统一的处理接口,也就意味着,处理着相同的输入。
边栏推荐
猜你喜欢
自然语言处理 文本预处理(上)(分词、词性标注、命名实体识别等)
交换网络----三种生成树协议
(Notes are not completed) [Graph Theory] Traversal of graphs
交换部分 VLAN
数据库概论之MySQL表的增删改查2
【请教】SQL语句按列1去重来计算列2之和
Wuhan 2022 organizing of the high-performance computing added new ecological development of high-performance computing
HCIP day 3 experiment
堡垒机、堡垒机的原理
【故障诊断分析】基于matlab FFT轴承故障诊断【含Matlab源码 2001期】
随机推荐
Wuhan 2022 organizing of the high-performance computing added new ecological development of high-performance computing
【机器学习】实验6布置:基于集成学习的Amazon用户评论质量预测
实验7 MPLS实验
【CV】OpenVINO安装教程
使用hutool做本地缓存的工具类
论文阅读 (64):Weakly-supervised Video Anomaly Detection with Robust Temporal Feature Magnitude Learning
Link with Game Glitch(spfa判负环)
Summer Summary (3)
获取间隔的日期列表工具类
逆变器绝缘检测检测功能及软件实现
LeetCode SQL 197. 上升的温度
交换--STP协议
数据库概论之MySQL表的增删改查1
【红队】ATT&CK - 创建或修改系统进程实现持久化(更新ing)
条件构造器~wapper
apt & apt-get命令
堡垒机、堡垒机的原理
_2_顺序表
FaceBook社媒营销高效转化技巧分享
(笔记整理未完成)【图论】图的遍历