随州网站建设外包公司,上海做网站hlanggroup,建门户网站要多少钱,dede企业模板/dedecms蓝色企模板/php网站源码1.背景 当一个请求需要经过多个节点的处理#xff0c;如果不考虑任何模式#xff0c;每个对象要根据是否符合条件来决定是不是自己处理#xff0c;这样就要使用if-else去处理。确定了类似A-B-C-D的处理流程后就不能再修改#xff08;除非修改源代码#xff09…1.背景 当一个请求需要经过多个节点的处理如果不考虑任何模式每个对象要根据是否符合条件来决定是不是自己处理这样就要使用if-else去处理。确定了类似A-B-C-D的处理流程后就不能再修改除非修改源代码导致客户端无法定制处理流程。再者各个节点的处理流程集中在一个类中违反了“单一职责原则”将导致测试和维护难度加大最后无法在运行时动态的增加、修改或者删除处理流程中的处理节点灵活性缺失。
2.定义 使多个对象都有机会处理请求从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求直到有对象能够处理它为止。发送请求的客户端并不知道链上的哪个对象会处理这个请求这使得系统在不影响客户端的情况下动态的组织和分配责任。
纯的责任链模式 一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个要么承担全部责任要么将责任推给下家不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中要求一个请求必须被某一个处理者对象所接收不能出现某个请求未被任何一个处理者对象处理的情况。
不纯的责任链模式 在一个不纯的职责链模式中允许某个请求被一个具体处理者部分处理后再向下传递或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求而且一个请求可以最终不被任何处理者对象所接收。
注在实际软件系统中很少能找到纯的责任链模式大多数情况是不纯的责任链模式。
3.组成结构
Client客户端向处理者提交请求对象。Handler抽象处理者定义了一个处理请求的接口设计为抽象类由于不同的具体处理者处理请求的方式不同因此在其中定义了抽象请求处理方法。持有下一个抽象处理者的引用通过该引用处理者可以连成一条链。ConcreteHandler具体处理者抽象处理者的子类可以处理用户请求在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法在处理请求之前需要进行判断看是否有相应的处理权限如果可以处理请求就处理它否则将请求转发给后继者在具体处理者中可以访问链中下一个对象以便请求的转发。
4.示例代码 #include iostream
using namespace std;//抽象处理者
class Handler
{
public:Handler() { m_pNextHandler NULL; }virtual ~Handler() {}//设置下一个处理者void SetNextHandler(Handler* successor) { m_pNextHandler successor; }//处理请求virtual void HandleRequest(int days) 0;
protected:Handler* m_pNextHandler; // 后继者
};//具体处理者、主管
class Director :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days 1){cout 我是主管有权批准一天假同意了 endl;}else{m_pNextHandler-HandleRequest(days);}}
};//具体处理者、经理
class Manager :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days 3){cout 我是经理有权批准三以下的假同意了 endl;}else{m_pNextHandler-HandleRequest(days);}}
};//具体处理者、老板
class Boss :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days 7){cout 我是老板最多让你请7天假同意了 endl;}else{cout 你请的假事假太长了不同意 endl;}}
};//场景
int main()
{Handler* director new Director;Handler* manager new Manager;Handler* boss new Boss;//设置责任链director-SetNextHandler(manager);manager-SetNextHandler(boss);director-HandleRequest(1);director-HandleRequest(2);director-HandleRequest(5);director-HandleRequest(8);return 0;
}
/*结果
我是主管有权批准一天假同意了
我是经理有权批准三以下的假同意了
我是老板最多让你请7天假同意了
你请的假事假太长了不同意
请按任意键继续. . .*/引用
https://blog.csdn.net/Golden_Knight/article/details/103363616
C之责任链(Chain of Responsibility)模式_c 责任链模式-CSDN博客