行为型模式
16)职责链
本文参考:
假如有多个对象可以处理同一个请求,但是具体由哪个对象处理是在运行时刻动态决定的。这时就可以使用职责链模式,将处理请求的对象实现成职责对象,并构造链。
职责链模式主要包含两种角色:
第一种,抽象职责类。
第二种,具体职责类。
以员工请求加薪为例。如果员工请求加薪小于500,那么经理可以直接处理,如果员工请求加薪大于500小于800,那么总监可以处理,如果大于800,那么还需要上报总经理处理。
//抽象管理者
class Manager{
protected:
Manager* m_manager; //这里是关键,代表当当前管理者无法处理时所交由的上级
string m_name;
public:
Manager(Manager* manager, string name):m_manager(manager),m_name(name){}
virtual void DealWithRequest(string name, int num){}
};
//经理
class CommonManager: public Manager{
public:
CommonManager(Manager* m, string name):Manager(m,name){}
void DealWithRequest(string name, int num){
if(num<500)
cout<<"经理"<<m_name<<"批准"<<name<<"加薪"<<num<<endl<<endl;
else
{
cout<<"经理无法"<<m_name<<"批准"<<name<<"加薪"<<num<<endl<<endl;
m_manager->DealWithRequest(name, num);
}
}
};
//总监
class MajorManager: public Manager{
public:
MajorManager(Manager* m, string name):Manager(m, name){}
void DealWithRequest(string name, int num){
if(num<800)
cout<<"总监"<<m_name<<"批准"<<name<<"加薪"<<num<<endl<<endl;
else
{
cout<<"总监无法"<<m_name<<"批准"<<name<<"加薪"<<num<<endl<<endl;
m_manager->DealWithRequest(name, num);
}
}
};
//总经理
class GeneralManager:public Manager{
public:
GeneralManager(Manager* manager, string name):Manager(manager, name){}
void DealWithRequest(string name, int num){
cout<<"总经理批准"<<name<<"加薪"<<num<<endl<<endl;
}
};
int main()
{
Manager* general = new GeneralManager(NULL,"A");
Manager* major = new MajorManager(general,"B");
Manager* common = new CommonManager(major, "C");
common->DealWithRequest("D",300);
}
运行结果为: