• c++ 职责链模式(Chain of Responsibility)


     职 责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量 在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成 了一条链,直到有一个对象处理请求。给出这个例子的UML图。

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    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* manager,string name):Manager(manager,name){}
        void DealWithRequest(string name,int num)
        {
            if(num < 500)
            {
                cout << "经理" <<m_name << "批准" << name << "加薪" << num << "" <<endl;
            }
            else
            {
                cout << "经理" << m_name << "无法处理,交由总监处理" <<endl;
                m_manager->DealWithRequest(name,num);
            }
        }
    };
    
    class Majordomo:public Manager
    {
    public:
        Majordomo(Manager *manager,string name):Manager(manager,name){}
        virtual void DealWithRequest(string name,int num)
        {
            if(num < 1000)
            {
                cout << "总监" <<m_name << "批准" << name << "加薪" << num << "" <<endl;
            }
            else
            {
                cout << "总监" << m_name << "无法处理,交由总经理处理" <<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 << "总经理" <<m_name << "批准" << name << "加薪" << num << "" <<endl;
        }
    };

    客户端使用:

    #include <iostream>
    #include "state.h"
    
    using namespace std;
    
    int main()
    {
        Manager *general = new GeneralManager(NULL,"a");
        Manager *majordomo = new Majordomo(general,"b");
        Manager *common = new CommonManager(majordomo,"c");
        common->DealWithRequest("d",400);
        common->DealWithRequest("d",700);
        common->DealWithRequest("d",1200);
        system("pause");
        return 0;
    }

    说明:

    1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个Manager对象负责处理它。

    2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。

    3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

  • 相关阅读:
    Hello,world的几种写法!
    浮动与清除浮动
    css中表格的table-layout属性特殊用法
    CSS之照片集效果
    CSS之transition过渡练习
    CSS之过渡简单应用—日落西山
    CSS之立方体绘画步骤
    CSS之立体球体
    transform
    Vue.sync修饰符与this.$emit('update:xxx', newXXX)
  • 原文地址:https://www.cnblogs.com/onlycxue/p/3503658.html
Copyright © 2020-2023  润新知