c++ 责任链模式

 
责任链模式(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 ;
}

代码中申请了超过10成的订购请求,于是各级别负责人一步一步向上级提交申请,并最终由最上层决定审批结果。

运行结果如下:
申请金额超出主管权限范围,需向总经理申请审批
申请金额超出总经理权限范围,需向董事长申请审批
董事长审批了采购请求
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值