重写报销流程,责任链模式实现

之前写了一个 状态机模式报销流程,用的状态机,可能受了WF的影响,处理这类似的流程首先想到状态机,可是怎么看怎么别扭,终于想到了一个非常合适的模式——责任链模式

图以后再补上,先贴出代码,需求和以前一样,报销人分为销售人员和项目经理,报销人可以扩展。报销流程靠报销金额判断,不同金额不同流程。

using  System;

abstract   class  Request
{
    
public   int  Money {  get set ; }
}

class  SalesRequest : Request
{
    
public  SalesRequest( int  money)
    {
        
this .Money  =  money;
        Console.WriteLine(
" 销售人员报销{0}元 " , Money);
    }
}

class  ProjectManagerRequest : Request
{
    
public  ProjectManagerRequest( int  money)
    {
        
this .Money  =  money;
        Console.WriteLine(
" 项目经理报销{0}元 " , Money);
    }
}

static   class  ManagerFactory
{
    
public   static  Manager CreateManager( string  name)
    {
        Manager manager 
=   null ;
        
switch  (name)
        {
            
case   " ProjectManager " :
                manager 
=   new  ProjectManager();
                
break ;
            
case   " DepartmentManager " :
                manager 
=   new  DepartmentManager();
                
break ;
            
case   " GeneralManager " :
                manager 
=   new  GeneralManager();
                
break ;
        }
        
if  (manager  ==   null throw   new  Exception( " 设置的名称有错误! " );
        
return  manager;
    }
}

abstract   class  Manager
{
    
protected  Manager manager;
    
public   void  SetSuperior(Manager manager)
    {
        
this .manager  =  manager;
    }

    
public   abstract   void  Handler(Request request);
}

class  ProjectManager : Manager
{
    
public   override   void  Handler(Request request)
    {
        
if  (request.Money  <   200 )
        {
            Console.WriteLine(
" {0}元,小于200,项目经理签字报销 " , request.Money);
        }
        
else
        {
            Console.WriteLine(
" {0}元,大于200,项目经理无权报销,签字后上报部门经理 " , request.Money);
            manager.Handler(request);
        }
    }
}

class  DepartmentManager : Manager
{
    
public   override   void  Handler(Request request)
    {
        
if  (request.Money  <   1000 )
        {
            Console.WriteLine(
" {0}元,小于1000,部门经理签字报销 " , request.Money);
        }
        
else
        {
            Console.WriteLine(
" {0}元,大于1000,部门经理无权报销,签字后上报总经理 " , request.Money);
            manager.Handler(request);
        }
    }
}

class  GeneralManager : Manager
{
    
public   override   void  Handler(Request request)
    {
        
if  (request.Money  <   2000 )
        {
            Console.WriteLine(
" {0}元,小于2000,总经理签字报销 " , request.Money);
        }
        
else
        {
            Console.WriteLine(
" {0}元,大于2000,总经理说:以后再说吧 " , request.Money);
        }
    }
}

class  Test
{
    
static   void  Main()
    {
        Manager projectManager 
=  ManagerFactory.CreateManager( " ProjectManager " );
        Manager departmentManager 
=  ManagerFactory.CreateManager( " DepartmentManager " );
        Manager generalManager 
=  ManagerFactory.CreateManager( " GeneralManager " );

        projectManager.SetSuperior(departmentManager);
        departmentManager.SetSuperior(generalManager);

        
// 销售人员报销,首先找项目经理处理
        Request salesPerson  =   new  SalesRequest( 1650 );
        projectManager.Handler(salesPerson);

        
// 项目经理报销,部门经理首先处理
        Request projectManagerRequest  =   new  ProjectManagerRequest( 1780 );
        departmentManager.Handler(projectManagerRequest);
    }
}


转载于:https://www.cnblogs.com/kyorry/archive/2008/05/25/1207095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值