我想通过策略模式给单据返回不同的审批者 ,这个问题应该如何解决呢?或许应该更改我的设计?

关于审批单业务中的策略模式运用的问题。 

我的业务场景中需要处理一种审批单据, 
这种单据根据提出人不同(日入经理和普通职员), 
审批者是不一样的。 

//伪代码如下: 
class ApprovalForm 

    public ApprovalStrategy approvalStrategy; 
   
    //提交申请单 
    public Send() 
    { 
        List<Approver>    approverList = approvalStrategy.GetApprover(); 
        Send to next   Approver  ;      
    } 



Interface  ApprovalStrategy 

     List<Approver> .GetApprover(); 


class ManagerStrategy  : ApprovalStrategy 

    public List<Approver> .GetApprover() 
    { 
        return Manager's Approver; 
    } 


class EmployeeStrategy : ApprovalStrategy 

    public List<Approver> .GetApprover() 
    { 
        return  Employee's Approver; 
    } 


Main() 

    ApprovalForm form = new ApprovalForm(); 

    if ( current user is Manager ) 
        form.approvalStrategy; =  new ManagerStrategy (); 
    if ( current user is Manager ) 
        form.approvalStrategy; =  new EmployeeStrategy (); 


问题是,策略模式虽然帮我在ApprovalForm里面去掉了硬编码的判断, 
但是最终我还是要在Mian里面进行硬编码的判断。 

一只萌萌小番薯
浏览 109回答 2
2回答

开满天机

设计模式只是帮你减少选择的过程和容易扩展,但是不能完全消除if else,因为必然有一个地方需要这样去判断,顶多有的模式是隐藏了判断的实现,你感觉看不到而已。而你这个需求,current user 这个人的角色,肯定是从前台,或者是从当前session获取到的一个标识,你要怎样把这个标识和你的底层类结合起来,还是得靠判断,所以还是别想消除这个if else了,倒是我觉得你可以把这个判断放到更加底层的类里面,比如你建立一个工厂,这个工厂通过你的参数来生产对应的实现类。

一只甜甜圈

//伪代码如下:&nbsp;&nbsp;&nbsp;class&nbsp;ApprovalForm&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ApprovalStrategy&nbsp;approvalStrategy;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//提交申请单&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Send()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<Approver>&nbsp;&nbsp;&nbsp;&nbsp;approverList&nbsp;=&nbsp;approvalStrategy.GetApprover();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Send&nbsp;to&nbsp;next&nbsp;&nbsp;&nbsp;Approver&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Interface&nbsp;&nbsp;ApprovalStrategy&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<Approver>&nbsp;.GetApprover();&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;ManagerStrategy&nbsp;&nbsp;:&nbsp;ApprovalStrategy&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List<Approver>&nbsp;.GetApprover()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Manager's&nbsp;Approver;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;EmployeeStrategy&nbsp;:&nbsp;ApprovalStrategy&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List<Approver>&nbsp;.GetApprover()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;Employee's&nbsp;Approver;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;直接在这层加判断就行 &nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java