目录
1、责任链模式chain of responsibility
1、责任链模式chain of responsibility
(1)意图
使多个对象有机会处理请求,从而避免请求的发送者和接受者之间耦合关系,将这些对象形成一个链,并沿着这条链传递请求,直到一个对象处理他为止。
(2)结构
handler定义一个处理请求的接口:(可选)实现后继者
concretehandler处理它的请求:可访问她的后继者,如果可处理该请求,就处理他,否则就请求转发给后继者。
client向链上的具体处理者(concretehandler)对象提供请求
(3)适用性
有多个对象处理一个请求,那个对象处理该请求运行时刻自动确定。
想不在明确制定接受的情况下向多个对象中一个提交一个请求。
可处理要给请求对象集合应被动态制定
2、根据UML编写代码
(1) 泛化关系
结构中hangler作为父类有两个具体子类(concretehandler1、concretehandler2),由两个子类具体实现对应的操作。
(2)关联关系
在不考虑客户端的情况handler有个自关联,简而言之就是在自己的内部生成一个指向自己的指针,注意该指针在后续的操作中将提供给子类使用,原则上放在protected下。
(3)将UML代入生活
这个结构相对非常简单,该结构的理解我们可以用一个公司的报销例子完成:
张三她昨天请甲方吃了一顿饭,请甲方吃饭的费用报销需要财务部长和总经理两人同意,报销流程大致如下:首先张三填写好报销单拿给财务部长审核,财务部长在验证发票和报销填写无误后,提交给总经理,总经理在根据她个人判断决定要不要给张三报销。
这个过程非常清晰,财务部长只能在自己职责范围作出处理,他无法处理的事务就需要提交更高权限的人来审核。
3、代码实现
#include<iostream>
#include <stdio.h>
using namespace std;
class handler{
public:
handler(){}
virtual void handlerequest()=0;
virtual ~handler(){}
protected:
handler *next;//自关联
};
class concretehandler2:public handler{
public:
void handlerequest(){
cout<<"请总经理审批Y/N"<<endl;
c=getchar();
getchar();
if (c=='Y'or c=='y'){
cout<<"报销审核通过,请尽快找出纳报销该费用"<<endl;
}else{
cout<<"总经理审批不过"<<endl;
}
}
~concretehandler2(){
delete next;
}
private:
char c;
};
class concretehandler1:public handler{
public:
void handlerequest(){
cout<<"请财务部长审批Y/N"<<endl;
c=getchar();
getchar();
if (c=='Y'or c=='y'){
next=new concretehandler2;//形成链
cout<<"财务审核通过,请提交总经理签字"<<endl;
next->handlerequest();
}else{
cout<<"财务审批不过"<<endl;
}
}
~concretehandler1(){
delete next;
}
private:
char c;
};
int main(){
handler *a=new concretehandler1;
a->handlerequest();
delete a;
return 0;
}
输出结果: