• 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. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

  • 相关阅读:
    Host文件修改后无效的解决办法
    spring-framework-reference阅读笔记(一)
    利用instsrv和srvany来手动安装服务
    JSP
    DHTML (一)
    Java 多线程 (概述)
    Java IO (三)
    Java IO(二)
    Java 递归
    Java IO File (一)
  • 原文地址:https://www.cnblogs.com/onlycxue/p/3503658.html
Copyright © 2020-2023  润新知