为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2023-04-20 19:15:16
关于审批单业务中的策略模式运用的问题。 我的业务场景中需要处理一种审批单据, 这种单据根据提出人不同(日入经理和普通职员), 审批者是不一样的。 //伪代码如下: 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里面进行硬编码的判断。 
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超12个赞

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

查看完整回答
反对 回复 2023-04-23
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

//伪代码如下:   

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;   

    }   

}   

直接在这层加判断就行  


查看完整回答
反对 回复 2023-04-23
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信