现实需求:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。
责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
主要角色:
案例:
小码路上学的时候经常请假,请假的天数也越来越多,这时候班主任不耐烦了,我管不你了,你去找院长吧。用责任链模式设计一个请假条审批模块。分析:假如规定学生请假小于或等于 2 天,班主任可以批准;小于或等于 7 天,系主任可以批准;小于或等于 10 天,院长可以批准;其他情况不予批准。
第一步:抽象处理类
#pragma once
#include <iostream>
using namespace std;
//抽象处理者:领导类
class Leader
{
public:
void setNext(Leader *next)
{
this->next=next;
}
Leader* getNext()
{
return next;
}
//处理请求的方法
virtual void handleRequest(int Days)=0;
private:
Leader *next;
};
第二步:具体处理类
//具体处理者:班主任
class ClassLeader:public Leader
{
public:
void handleRequest(int Days)
{
if(Days <=2)
{
cout<<"班主任批准您请假: "<<Days<<" 天"<<endl;
}
else
{
if(getNext()!=NULL)
{
getNext()->handleRequest(Days);
}
else
{
cout<<"请假天数太多,去找系主任吧!"<<endl;
}
}
}
};
//具体处理者:班主任
class DepartmentLeader:public Leader
{
public:
void handleRequest(int Days)
{
if(Days <=7)
{
cout<<"系主任批准您请假: "<<Days<<" 天"<<endl;
}
else
{
if(getNext()!=NULL)
{
getNext()->handleRequest(Days);
}
else
{
cout<<"请假天数太多,去找院长吧!"<<endl;
}
}
}
};
//具体处理者:院长
class DeanLeader:public Leader
{
public:
void handleRequest(int Days)
{
if(Days <=10)
{
cout<<"院长批准您请假: "<<Days<<" 天"<<endl;
}
else
{
if(getNext()!=NULL)
{
getNext()->handleRequest(Days);
}
else
{
cout<<"请假天数太多,直接退学吧!"<<endl;
}
}
}
};
第三步:客户端责任链
#include "z.h"
int main()
{
//组装责任连
Leader *t1=new ClassLeader();
Leader *t2=new DepartmentLeader();
Leader *t3=new DeanLeader();
t1->setNext(t2);
t2->setNext(t3);
//提交请求
t1->handleRequest(2);
t1->handleRequest(8);
t1->handleRequest(18);
}
显示: