第10000页 chain of responsibility vs if-else
润物无声 (迷茫的时候就想读读芒格的语录)
- 章节名:chain of responsibility vs if-else
- 页码:第10000页
责任链模式与if-else 这个模式对于繁琐的if-else判断非常好用,也比较适合写框架代码。 1、首先if-else会让代码变得丑陋,模块与流程耦合,对于复杂的判断直接影响主业务流程,不利于扩展。 2、引入链(chain)则是让模块与流程解耦,如果A不能做,就让B做,依次类推。 举个例子,对于一个公司采购的审批,比如金额在1000以内让经理审批,1000-5000之前让主管审批。。。可以用if-else写,当然也可以用责任链
public class UglyPurchasePowerHandler { private PurchaseRequest request; public UglyPurchasePowerHandler(PurchaseRequest request) { this.request = request; } public void doHandler(PurchaseRequest request) { double totalAmount = request.getAmount(); if (totalAmount <= 1000) { System.out.println("your purchase request will send to manager!"); } else if (totalAmount > 1000 && totalAmount <= 5000) { System.out.println("your purchase request will send to director!"); } else { System.out.println("your purchase request can't be approved!"); } } public PurchaseRequest getRequest() { return request; } public void setRequest(PurchaseRequest request) { this.request = request; } }代码里面使用分支判断,这样做的弊端就是doHandler里面处理了所有的逻辑判断,将来扩展的时候要在这里面加入,其实这里面每一个分支判断就是一个不同的流程,对应不能的角色,完全可以分开,而主流程就是调用handler并且传递。
@Override public void doHandler() { if (request.getAmount() <= 1000) { System.out.println("your purchase request will send to manager!"); } else if (null != successorHandler) { successorHandler.doHandler(); } }上面是一个manager角色的handler。代码调用区别见下面
public class PurchaseHandlerTest { public static void main(String[] args) { PurchaseRequest request = new PurchaseRequest(2000, "test"); UglyPurchasePowerHandler handler = new UglyPurchasePowerHandler(request); handler.doHandler(request); ////////////////////////////////////////////////// DefaultPurchaseHandler defaultHandler = new DefaultPurchaseHandler(null, request); DirectorPurchaseHandler directorHandler = new DirectorPurchaseHandler(defaultHandler, request); ManagerPurchaseHandler managerHandler = new ManagerPurchaseHandler(directorHandler, request); managerHandler.doHandler(); } }解耦,关键是解耦,利于扩展。比如将来需要增加角色审批,加一个handler,不需要修改主业务流程。 优点:对于分支比较多的流程建议采用这种方式,加了分支后也仅仅是增加一节“链”,调用流程不会修改,这样也方便单元测试 缺点:代码量增加,增加一个handler需要增加一个类。 当handler变多时最好抽象出模版方法,减少重复代码。
27人阅读
说明 · · · · · ·
表示其中内容是对原文的摘抄