#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
/*定义一个加薪请求类*/
class RaiseRequest
{
public:
string m_name; /*加薪请求者姓名*/
int m_salary;/*加薪请求数量*/
public:
/*构造函数*/
RaiseRequest(string name, int salary) :m_name(name), m_salary(salary) {}
};
/*薪水审批者父类(管理类)*/
class ParSalApprover
{
public:
ParSalApprover() :m_nextChain(nullptr) {}
virtual ~ParSalApprover() {}
/*设置指向的职责链中的下个审批者*/
void setNextChain(ParSalApprover* next)
{
m_nextChain = next;
}
/*处理加薪请求,设置为纯虚函数,实际的实现由子类实现*/
virtual void processRequest(const RaiseRequest& req) = 0;
protected:
/*找链中的下个对象并把请求投递给下个链中的对象*/
void sendRequestToNextHandler(const RaiseRequest& req)
{
if(m_nextChain != nullptr)
{
m_nextChain->processRequest(req);
}
else
{
cout << req.m_name << "的加薪要求为:" << req.m_salary << "元,但无人能够审批!" << endl;
}
}
private:
ParSalApprover* m_nextChain;
};
/*部门经理子类*/
class depManager_SA :public ParSalApprover
{
public:
/*处理加薪请求*/
virtual void processRequest(const RaiseRequest& req)
{
if(req.m_salary <= 1000)
{
/*如果自己能处理,则自己处理*/
cout << req.m_name << "的加薪要求为:" << req.m_salary << "元,部门经理审批通过!" << endl;
}
else
{
/*自己不能处理,尝试找链中的下个对象来处理*/
sendRequestToNextHandler(req);
}
}
};
/*技术总监子类*/
class CTO_SA :public ParSalApprover
{
public:
virtual void processRequest(const RaiseRequest& req)
{
if(req.m_salary > 1000 && req.m_salary <= 5000)
{
cout << req.m_name << "的加薪要求为:" << req.m_salary << "元,技术总监审批通过!" << endl;
}
else
{
sendRequestToNextHandler(req);
}
}
};
/*总经理子类*/
class genManager_SA :public ParSalApprover
{
public:
virtual void processRequest(const RaiseRequest& req)
{
if(req.m_salary > 5000)
{
cout << req.m_name << "的加薪要求为:" << req.m_salary << "元,总经理审批通过!" << endl;
}
else
{
sendRequestToNextHandler(req);
}
}
};
int main()
{
//(1)创建出指责链中包含的各个对象(部门经理、技术总监、总经理)
ParSalApprover* pzzlinkobj1 = new depManager_SA();
ParSalApprover* pzzlinkobj2 = new CTO_SA();
ParSalApprover* pzzlinkobj3 = new genManager_SA();
//(2)将这些对象串在一起构成职责链(链表),现在职责链中pzzlinkobj1排在最前面,pzzlinkobj3排在最后面。
pzzlinkobj1->setNextChain(pzzlinkobj2);
pzzlinkobj2->setNextChain(pzzlinkobj3);
pzzlinkobj3->setNextChain(nullptr);
//(3)创建几位员工关于加薪的请求(对象)
RaiseRequest emp1Req("张三", 15000);
RaiseRequest emp2Req("李四", 3500);
RaiseRequest emp3Req("王二", 800);
//看看每位员工的加薪请求由职责链中的哪个对象(部门经理,技术总监,总经理)来处理,
pzzlinkobj1->processRequest(emp1Req);
pzzlinkobj1->processRequest(emp2Req);
pzzlinkobj1->processRequest(emp3Req);
//(4)释放资源
delete pzzlinkobj1;
delete pzzlinkobj2;
delete pzzlinkobj3;
return 0;
}
特点:
(a)一个请求对应多个接收者,但最后只有一个接收者会处理该请求。 请求发送者和接收者是解耦的。
(b)直线型职责链,可能会看到环形的或者树形结构的职责链。程序运行期间可以动态的添加、修改、删除职责链上的接收者,使针对请求的处理更具有灵活性。这是职责链模式的重要特色。
©增加新处理者不需要修改原有代码。符合开闭原则。
(d)如果请求传递到职责链末尾仍没有得到处理,则应该有一个合理的缺省处理方式。
(e)如果职责链比较长,能够处理该请求的接收者在职责链中比较靠后,则可能导致请求处理的延迟。若需要非常快的请求处理速度,则要权衡是否使用职责链模式。
(f)可以分别选择不同的接收者对象创建多条不同的职责链以增加接收者在职责链模式中的复用性。