使用策略模式优化if else
有这样一段逻辑
function{ for{ if() if() if( if( ) ) ... }}
公司有的祖传的代码,是一段规则校验,校验的越多,每一个请求都会进来校验,加上后来的开发人员也不注意,每次多加校验就多加一个if,只要命中就在if里面写逻辑,好一点的会抽到一个方法中,看起来稍好些,但是if越加越多,一个循环最终发展到了数千行,可读性越来越差,领导点名重构;
解决方案: 策略模式+工厂模式
工厂模式大家都很熟悉了,所以简单介绍一下策略模式
策略模式,顾名思义,组要是依靠策略来完成类的具体行为,所以,策略模式的核心就是编写不同的策略类,我们可以通过Java的接口编写抽象策略,用不同的实现类来完成策略,当然策略模式还需要一个上下文的类,用来选择策略;现实生活中也有很好的例子,例如支付方式,你可以选择微信支付,支付宝支付,银行卡支付等,
首先我们编写抽象策略
public interface Strategy { Boolean check(Object obj);}
然后我们编写具体的实现
public class StrategyImpl01 implements Strategy{ @Override public int check(Object obj) { // 实现具体的业务逻辑 return ""; }}public class StrategyImpl02 implements Strategy{}public class StrategyImpl03 implements Strategy{}...
实现上下文类
public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(Object obj){ return strategy.check(obj); }}
调用策略类
public static void main(String[] args) { Context context = new Context(new StrategyImpl01()); context.check(obj) context = new Context(new StrategyImpl02()); context.check(obj) context = new Context(new StrategyImpl03()); context.check(obj) }
到此,策略模式已经实现了,但是不是特别优雅,所以我们加上了工厂模式
编写策略工厂
public clss Factory{ // 申明一个全局的map,key 为if中的条件,value为策略类 private static final Map<String,Strategy> strategyMap = new HashMa<String,Strategy>(); // 填充map static { strategyMap.put("aaa",new StrategyImpl01()) strategyMap.put("bbb",new StrategyImpl02()) strategyMap.put("bbb",new StrategyImpl03()) ... } // 暴露一个获取map的方法 public static Strategy getStrategy(String key){ return strategyMap.get(key).check(obj) } }
这样,我们只需要在用的时候
public static void main(String[] args){ Factory.getStrategy(key);}
看起来优雅多了
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END