策略模式java实现,java策略模式应用场景

  策略模式java实现,java策略模式应用场景

  00-1010策略模式什么是策略模式?策略模式的使用场景?战略模式实践总结

  00-1010世界上没有格局;

  一些老程序鸟经过长时间的编程工作,总结出高效的代码编写,被后人称道;

  并整理出一个固定的书写标准,目前包括23种。

  这些规范被称为设计模式。

  00-1010在策略模式中,类或其算法的行为可以在运行时改变。这种类型的设计模式属于行为模式。

  00-1010Q:,我们知道,战略模式最重要的是封装变化点。我们通常用那边的转换点做什么?

  是的,A:,我们通常用if-else来处理它。我们需要对变化点做出不同的反应,因此策略模式可以取代代码中的if-else操作。

  其实策略模式主要是替换代码中的if-else操作,当然也可以是switch。

  Q: ,那么我有一个问题。我喜欢写if-else switch。为什么我要使用策略模式?只是为了看起来牛逼吗?

  首先,A: 并不是所有的if-else开关都适合战略模式的转换。策略模式是一把双刃剑,使用时会带来一些问题,比如阶级膨胀。

  既然Q:是一把双刃剑,那么如何判断是否应该使用战略模式呢?

  A: 策略模式针对代码中的if-else操作,主要针对if-else的嵌套层次和每个if-else下的代码处理行数;

  (你的if-else判断超过两次)(每个if-else下的处理代码超过5行)——建议使用策略模式优化代码。

  00-1010我们使用一个简单的计算器需求来模拟策略模式的使用场景。

  /* * * calculator * * @ author cans * @ date 2022/3/26 * */public class calculator {/* * * Calculate nums * * @ param num 1 param 1 param 2 param 2 * @ param operator运算算法* @ return */public Integer Calculate(Integer num 1,Integer num2,String operator){ if(operator . equals(){ return num 1 num 2;} else if(operator . equals(-){ return num 1-num 2;}抛出new RuntimeException(无效运算算法);}}上面的代码用if-else代码实现了一个简单的计算器代码,实现起来没有太大问题,但是也有弊端。

  1.扩展性不好。例如,需要在代码中追加if-else来扩展乘法。

  2.一两个if-else就可以了。如果运算算法太多,会影响代码的可读性。

  下面使用策略模式来优化这段代码。

  /* * *使用策略模式进行优化* * @ author cans * @ date 2022/3/26 * */public class Calculator 2 { PrivateMapString,Calculator Calculator Map=new hashmap();public calculator 2(){ calculatoroperatoradimpl calculatorOperatorAdd=new calculatoroperatoradimpl();calculatoroperator subimpl calculatorOperatorSub=new CalculatorOperatorSubImpl();calculatoroperatormap . put(calculatorOperatorAdd . get operator()、calculatorOperatorAdd);calculatoroperatormap . put(calculatoroperatorsub . get operator(),

  calculatorOperatorSub); } /** * 计算数字 * * @param num1 参数1 * @param num2 参数2 * @param operator 操作算法 * @return */ public Integer calculate(Integer num1, Integer num2, String operator) { CalculatorOperator calculatorOperator = calculatorOperatorMap.get(operator); if(calculatorOperator == null){ throw new RuntimeException("无效的操作算法:" + operator); } return calculatorOperator.calculate(num1, num2); } /** * 支持的算法枚举 */ public enum Operator{ ADD("+"),SUB("-"); private String operator; Operator(String operator){ this.operator = operator; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } } /** * 计算顶层接口 */ public interface CalculatorOperator{ /** * 算法操作 * @return */ public String getOperator(); /** * 计算方法 * * @param num1 参数1 * @param num2 参数2 * @return */ public Integer calculate(Integer num1, Integer num2); } /** * 加法实现 */ public class CalculatorOperatorAddImpl implements CalculatorOperator{ @Override public String getOperator() { return Operator.ADD.getOperator(); } /** * 加法操作 * @param num1 参数1 * @param num2 参数2 * @return */ public Integer calculate(Integer num1, Integer num2) { return num1 + num2; } } /** * 减法实现 */ public class CalculatorOperatorSubImpl implements CalculatorOperator{ @Override public String getOperator() { return Operator.SUB.getOperator(); } /** * 加法操作 * @param num1 参数1 * @param num2 参数2 * @return */ public Integer calculate(Integer num1, Integer num2) { return num1 - num2; } } @Test public void testCalculate(){ System.out.println("1+1 = : " + calculate(1,1,"+")); System.out.println("1-1 = : " + calculate(1,1,"-")); System.out.println("1*1 = : " + calculate(1,1,"*")); }}策略模式以后类比较多,画个简单的图方便理解

  

 

  其实这里结合工厂模式更好用,使用Map calculatorOperatorMap其实也一个意思;

  可以看到使用策略模式以后类膨胀非常厉害,从之前1个类膨胀到4个类,但是扩展性得到了大大的提升,后续的算法扩展只需要在枚举中新增枚举类,实现响应的算法实现即可;

  综上示例策略模式优势如下几点:

  1.扩展性提升;

  2.主体业务逻辑更清晰;

  

 

  

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: