zoukankan      html  css  js  c++  java
  • 【c++设计模式】职责链模式

    行为型模式

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

    运行结果为:

  • 相关阅读:
    JavaScript 利用 filter+正则表达式对 list进行过滤包括模糊匹配
    odoo恢复数据库后,登录之后,显示空白页的问题
    Vue修改对象的属性值后页面不重新渲染问题
    智慧树(知到)刷课软件更新详情
    【C#】对两张图片进行矩阵运算会怎么样?
    DICOM协议中的UID详解
    DICOM医学文件的解析
    robots.txt协议——网络爬虫的“盗亦有道”
    机器学习算法之Kmeans算法(K均值算法)
    OPENGL shader 知识点
  • 原文地址:https://www.cnblogs.com/corineru/p/12056860.html
Copyright © 2011-2022 走看看