伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

请将你的 if else 设计成责任链模式!

来源:本站原创 浏览:86次 时间:2022-05-10

我只想问你一句,你真的懂 if else 吗?真的懂设计模式吗?真的是高级开发亦或是架构师吗?请看看你的代码 if else 已超过 200 行了。类似的还有 switch case,这样的设计和做法在日常中已经举不胜举。我恳请你淘汰这样的做法,也请你将你的 if else 设计成责任链模式。

当然并不是要把所有的 if else(switch case 也类似,下面就只用 if else 做说明)都改成责任链。至于如何判断是不是要设计成责任链模式,我想说没有标准,就像拆分微服务一样。

虽然没有标准,但是并不代表没有规则。如果你的 if else 设计的违反了“单一职责原则”、“开闭原则”等那就可以进行责任链模式设计。

下面我列举一个例子,来说明。

就拿我们公司来说,有一个采购审批业务。业务处理流程如下图:

采购人员提交一个单子后,需要经过主任、副董事长、董事长、董事会进行审批。如果我们按照 if else 的方式编码,代码就如下面所示:

//采购单处理类 public class PurchaseApprovalHandler {     //递交采购单给主任     public void doApproval(PurchaseRequest request) {         if (request.getAmount() < 50000) {             //主任可审批该采购单             this.handleByDirector(request);         } else if (request.getAmount() < 100000) {             //副董事长可审批该采购单             this.handleByVicePresident(request);         } else if (request.getAmount() < 500000) {             //董事长可审批该采购单             this.handleByPresident(request);         } else {             //董事会可审批该采购单             this.handleByCongress(request);         }     }     //主任审批采购单     public void handleByDirector(PurchaseRequest request) {         //代码省略     }     //副董事长审批采购单     public void handleByVicePresident(PurchaseRequest request) {         //代码省略     }     //董事长审批采购单     public void handleByPresident(PurchaseRequest request) {         //代码省略     }     //董事会审批采购单     public void handleByCongress(PurchaseRequest request) {         //代码省略     } }

看似很完美,但实际上后续维护会存在很多问题。比如,当前这个类业务过于复杂。各级别的审批方法都集中在一个类中,违反了“单一职责原则”。

功能虽然没有问题,但是维护麻烦。为了不违反“单一职责原则”,我们也可以将业务拆分为多个类。但是现在我又有新的需求了,新增一个审批节点,或者调整某一节点的审批额度范围,必须对源代码进行修改,同时需要进行严格的测试。现在你还觉得上面的设计方式好吗?是不是感觉上面的设计违反了“开闭原则”。

现在我告诉你并没有完美无缺的代码和架构设计,就像高内聚和低耦合一样,我们只要掌握好平衡即可。下面我们将上面的 if else 模式改为责任链模式看看是否符合设计原则。

再开始之前,我们先来看一下责任链模式的结构图:

按照上面的结构图,我们照葫芦画瓢即可。需要说明的一点是,责任链模式我相信大家都不模式了,但是大多数人理解它,就是不会用,或者说不知道用在什么样的场景,所以上图中的每个类我就不在细说,直接略过。

按照上图,我们先抽象一个 Handler,代码如下:

abstract class Handler {     //维持对下家的引用     protected Handler successor;     public void setSuccessor(Handler successor) {         this.successor=successor;     }     public abstract void handleRequest(String request); }

然后就是 Handler 的实现类,也就是审批处理类:

public class ConcreteHandler extends Handler {     public void handleRequest(String request) {         if (请求满足条件) {             //处理请求         }  else {             this.successor.handleRequest(request);  //转发请求         }     } }

伪代码写完后,是不是感觉和上面没什么区别。是的功能上是没有什么区别,但是在代码的维护上更方便,也更符合我们的设计原则。

常见的符合责任链模式的还有处理各种请求报文,例如 dubbo 中的用到的责任链模式。

学习责任链模式,我们更多的是要用,而不是为了学习而学习!

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763,QQ2群:454796847,QQ3群:187424846。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net