• 设计模式-责任链模式


    责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。结构图为:


    用一个采购的例子来说明,采购人员在进行采购前需经过上级部门的批准,对于不同金额的采购分别要由不同级别的上级才能审批,假设1万以内的采购需要主管批准,10万以内的需要主管向总经理申请批准,超过10万总经理向需董事长宴请批准,这时对于采购的审批过程就形成了一条责任链,对于不同的采购请求就需要一级一级的向上传递,并最终传递到最上级然后自行处理。
    结构图如下:


    实现代码:

    //Processor.h
    class Processor
    {
    public:
        
    virtual ~Processor();

        
    virtual void Request(double= 0;
        
    void SetSuccessor(Processor*);
    protected:
        Processor();
        Processor
    * m_pProcessor;
    };

    //Processor.cpp
    #include "stdafx.h"
    #include 
    "Processor.h"

    Processor::Processor()
    {

    }

    Processor::
    ~Processor()
    {
        
    if(m_pProcessor != NULL)
        {
            delete m_pProcessor;
            m_pProcessor 
    = NULL;
        }
    }

    void Processor::SetSuccessor(Processor* pProcessor)
    {
        m_pProcessor 
    = pProcessor;
    }

    //Director.h
    #include "Processor.h"

    class Director : public Processor
    {
    public:
        Director();
        
    virtual ~Director();

        
    void Request(double);
    };

    //Director.cpp
    #include "stdafx.h"
    #include 
    "Director.h"
    #include 
    <iostream>

    using namespace std;

    Director::Director()
    {

    }

    Director::
    ~Director()
    {

    }

    void Director::Request(double dAmount)
    {
        
    if(dAmount <= 10000)
        {
            cout 
    << "主管审批了采购请求" << endl;
        }
        
    else
        {
            cout 
    << "申请金额走出主管权限范围,需向总经理申请审批" << endl;
            
    if(this->m_pProcessor != NULL)
            {
                m_pProcessor
    ->Request(dAmount);
            }
        }
    }

    //Manager.h
    #include "Processor.h"

    class Manager : public Processor
    {
    public:
        Manager();
        
    virtual ~Manager();

        
    void Request(double);
    };

    //Manager.cpp
    #include "stdafx.h"
    #include 
    "Manager.h"
    #include 
    <iostream>

    using namespace std;

    Manager::Manager()
    {

    }

    Manager::
    ~Manager()
    {

    }

    void Manager::Request(double dAmount)
    {
        
    if(dAmount <= 100000)
        {
            cout 
    << "总经理审批了采购请求" << endl;
        }
        
    else
        {
            cout 
    << "申请金额超出总经理权限范围,需向董事长申请审批" << endl;
            
    if(this->m_pProcessor != NULL)
            {
                m_pProcessor
    ->Request(dAmount);
            }
        }
    }

    //Chariman.h
    #include "Processor.h"

    class Chariman : public Processor
    {
    public:
        Chariman();
        
    virtual ~Chariman();

        
    void Request(double);
    };

    //Chariman.cpp
    #include "stdafx.h"
    #include 
    "Chariman.h"
    #include 
    <iostream>

    using namespace std;

    Chariman::Chariman()
    {

    }

    Chariman::
    ~Chariman()
    {

    }

    void Chariman::Request(double dAmount)
    {
        cout 
    << "董事长审批了采购请求" << endl;
    }

    //main.cpp
    #include "stdafx.h"
    #include 
    "Processor.h"
    #include 
    "Director.h"
    #include 
    "Manager.h"
    #include 
    "Chariman.h"

    int main(int argc, char* argv[])
    {
        Processor
    * pDirector = new Director;
        Processor
    * pManager = new Manager;
        Processor
    * pChariman = new Chariman;
        pDirector
    ->SetSuccessor(pManager);
        pManager
    ->SetSuccessor(pChariman);

        pDirector
    ->Request(10000000.00);
        
    return 0;
    }
  • 相关阅读:
    怎样在ASP.NET中使用VB.NET上传大文件
    准备开始研读petShop
    Documentum常见问题9—导航树的一些常见设置
    [转]CMMI 入门 基本术语:约束、假设、依赖、风险、承诺
    MyEclipse 8.6反编译插件安装
    Documentum常见问题7—为客户化Type类型Import时添加自定义属性
    【自省篇】程序员的十大技术烦恼
    Documentum常见问题10修改特定Type的显示图标
    打发时间的题目,每天做一点
    Documentum常见问题8—限制导航树上的文件夹个数
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2418310.html
Copyright © 2020-2023  润新知