模式定义:
使多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
使用场景:
当一个任务因为条件的不同,需要被一连串的对象进行处理时可以考虑用职责链模式。
模式利弊:
当客户提交一个请求时,请求是沿着链路传递直至有一个具体的对象将他处理。这就使得接受者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。类中仅需要保持一个指向后继者的引用,而并不需要保持它所有的后继者的引用。这样就大大降低了耦合度。
模式类图:
代码演示:
比如一个公司职员因为私事去找领导请假,根据公司规定,一天以内的请假科长可以酌情审批,三天以内的请假部长可以酌情审批,三天以上的请假恐怕只有总裁能够审批,该场景完全符合职责链模式描述的因为条件不同,而需要一连串对象处理的情况。用职责链模式可以写成如下:
#include<iostream>
using namespace std;
class Manager{
public:
void setHandler(Manager* manager);
virtual void handleRequest(double day) = 0;
protected:
Manager* manager;
};
void Manager::setHandler(Manager* manager){
this->manager = manager;
}
class Cheif:public Manager{
public:
virtual void handleRequest(double day);
};
void Cheif::handleRequest(double day){
if(day <= 0){
cout<<"别闹了,老实干活儿去!"<<endl;
}else if(day > 0 && day <= 1){
cout<<"好的,在家好好休息吧!"<<endl;
}else{
cout<<"我无权审批,已经将你的申请提交到部长"<<endl;
manager->handleRequest(day);
}
};
class Minister:public Manager{
public:
virtual void handleRequest(double day);
};
void Minister::handleRequest(double day){
if(day > 1 && day <= 3){
cout<<"好的,这阵子辛苦了,好好休息!"<<endl;
}else{
cout<<"我无权审批,已经将你的申请提交到总裁"<<endl;
manager->handleRequest(day);
}
};
class CEO:public Manager{
public:
virtual void handleRequest(double day);
};
void CEO::handleRequest(double day){
if(day > 3 && day <= 7){
cout<<"好的,这阵子辛苦了,好好出去玩吧!"<<endl;
}else{
cout<<"这位同事,你是不想干了是不是!!!"<<endl;
}
};
int main(){
Manager* manager1 = new Cheif();
Manager* manager2 = new Minister();
Manager* manager3 = new CEO();
manager1->setHandler(manager2);
manager2->setHandler(manager3);
manager1->handleRequest(1);
cout<<"****************************************"<<endl;
manager1->handleRequest(4);
cout<<"****************************************"<<endl;
manager1->handleRequest(8);
return 0;
}