// 定义:使多个对象都有机会处理请求,从而避免请求的发送者
// 和接收者之间的耦合关系
//
// 模式举例:员工要求加薪,500以内项目经理直接批准,500-1000
// 技术总监批准,1000以上得找总经理批准,都是向项目经理
// 提出加薪,最终是谁批准要看金额
//
// 模式特点:
//
//
#include<iostream>
#include<string>
using namespace std;
class Manager
{
public:
Manager(string name,Manager * manager)
{
m_name = name;
m_manager = manager;
}
virtual void dealRequest(string name,int count)=0;
protected:
string m_name; //自己名字
Manager * m_manager; //顶头上司
};
//项目经理
class ProjectManager : public Manager
{
public:
ProjectManager(string name,Manager * manager):Manager(name,manager){}
virtual void dealRequest(string name,int count)
{
if(count < 500)
{
cout<<m_name<<" 批准 "<<name<<" 涨薪"<<count<<endl;
}
else
{
m_manager->dealRequest(name,count);
}
}
};
//总监
class Majordomo : public Manager
{
public:
Majordomo(string name,Manager * manager):Manager(name,manager){}
virtual void dealRequest(string name,int count)
{
if(count < 1000)
{
cout<<m_name<<" 批准 "<<name<<" 涨薪"<<count<<endl;
}
else
{
m_manager->dealRequest(name,count);
}
}
};
//总经理
class GeneralManager : public Manager
{
public:
GeneralManager(string name,Manager * manager):Manager(name,manager){}
virtual void dealRequest(string name,int count)
{
if(count >= 1000)
{
cout<<m_name<<" 批准 "<<name<<" 涨薪"<<count<<endl;
}
else
{
m_manager->dealRequest(name,count);
}
}
};
int main()
{
Manager * generalManager = new GeneralManager("总经理",NULL);
Manager * majordomo = new Majordomo("技术总监",generalManager);
Manager * projectManager = new ProjectManager("项目经理",majordomo);
projectManager->dealRequest("小明",400);
projectManager->dealRequest("小丽",800);
projectManager->dealRequest("老王",1100);
return 0;
}