行为型模式

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);
}

运行结果为:

12-24 15:50