行为型模式
16) 职责链
本文参考:
https://www.cnblogs.com/xuwendong/p/9814425.html
假如有多个对象可以处理同一个请求, 但是具体由哪个对象处理是在运行时刻动态决定的. 这时就可以使用职责链模式, 将处理请求的对象实现成职责对象, 并构造链.
职责链模式主要包含两种角色:
第一种, 抽象职责类.
第二种, 具体职责类.
以员工请求加薪为例. 如果员工请求加薪小于 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);
- }
运行结果为:
来源: http://www.bubuko.com/infodetail-3336855.html