当时的现有代码确实已经是有一堆的 if 了哈,碰巧呢,组长又让我接了一个新需求,好家伙,那不是还要继续 if? 我心想,别吧!是时候捣鼓捣鼓设计模式了。但是经典的设计模式不是多达二十好几种吗,用哪一种呢?结合业务特点,由于客户来自于四面八方的渠道,所以它们对应到后端各自的授信模型和数据结构也就有所不同,相当于说,在这里,每个渠道可以看成是一种策略,那这不正好可以用上策略模式了吗?先来温习一下策略模式的套路代码:
@Component// 结合Spring使用,交给 ApplicationContext 管理 publicclassConcreteLimitStrategyAimplementsLimitStrategy{ @Override public Result getLimitResult(){ Result result = new Result(); // 实现A自己的业务逻辑 ... return result; } }
@Component publicclassConcreteLimitStrategyBimplementsLimitStrategy{ @Override public Result getLimitResult(){ Result result = new Result(); // 实现B自己的业务逻辑 ... return result; } }
Context 类
java
1 2 3 4 5 6 7 8 9 10 11 12 13
publicclassLimitContext{ private LimitStrategy strategy; publicLimitContext(LimitStrategy strategy){ this.strategy = strategy; } // 客户端统一调用这个方法 public Result getLimitResult(){ return strategy.getLimitResult(); } }
publicclassConstant{ publicstaticfinal String CHANNEL_A = "此处填写 A 策略实现类在 Spring 容器中的唯一标识"; publicstaticfinal String CHANNEL_B = "此处填写 B 策略实现类在 Spring 容器中的唯一标识"; }
这样一顿改造之后,原来一堆的 if 和 else的地方就可以改成
java
1 2 3 4 5 6 7 8 9
publicclassClient{ // 对外提供的接口 public Result getLimitResult(Request request){ BizParam params = getBizParam(request); LimitStrategy strategy = SimpleStrategyFactory.createStrategy(params); LimitContext context = new LimitContext(strategy); return context.getLimitResult(); } }
这样一来,在真正方法调用的地方就再也见不到那些 “讨厌” 的 if 和 else if 了,相比起未重构之前的:
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
publicclassClient{ // 对外提供的接口 public Result getLimitResult(Request request){ BizParam params = getBizParam(request); Result result = new Result(); if ("channelA".equals(ChannelHelper.getChannel(params))) { // 几十行业务代码 result = ...; } elseif ("channelB".equals(ChannelHelper.getChannel(params))) { // 几十行业务代码 result = ...; } elseif ("channelC".equals(ChannelHelper.getChannel(params))) { // 几十行业务代码 result = ...; } return result; } }