publicintcalculate(int a, int b, String operator){ int result = Integer.MIN_VALUE;
if ("add".equals(operator)) { result = a + b; } elseif ("multiply".equals(operator)) { result = a * b; } elseif ("divide".equals(operator)) { result = a / b; } elseif ("subtract".equals(operator)) { result = a - b; } elseif ("modulo".equals(operator)) { result = a % b; } return result; }
case-switch
publicintcalculateUsingSwitch(int a, int b, String operator){ int result = 0; switch (operator) { case"add": result = a + b; break; case"multiply": result = a * b; break; case"divide": result = a / b; break; case"subtract": result = a - b; break; case"modulo": result = a % b; break; default: result = Integer.MIN_VALUE; } return result; }
重构
工厂方式重构
抽象层Operation.java
publicinterfaceOperation{ intapply(int a, int b); }
加法实现Addition.java:
publicclassAdditionimplementsOperation{ @Override publicintapply(int a, int b){ return a + b; } }
减法实现Subtraction.java
publicclassSubtractionimplementsOperation{ @Override publicintapply(int a, int b){ return a - b; } }
乘法实现Multiplication.java
publicclassMultiplicationimplementsOperation{ @Override publicintapply(int a, int b){ return a*b; } }
除法实现Division.java
publicclassDivisionimplementsOperation{ @Override publicintapply(int a, int b){ return a / b; } }
求余实现Modulo.java
publicclassModuloimplementsOperation{ @Override publicintapply(int a, int b){ return a % b; } }
publicclassOperatorFactory{ static Map<String, Operation> operationMap = new HashMap<>(); static { operationMap.put("add", new Addition()); operationMap.put("divide", new Division()); operationMap.put("multiply", new Multiplication()); operationMap.put("subtract", new Subtraction()); operationMap.put("modulo", new Modulo()); } publicstatic Optional<Operation> getOperation(String operation){ return Optional.ofNullable(operationMap.get(operation)); } }
使用示例
publicintcalculateUsingFactory(int a, int b, String operator){ Operation targetOperation = OperatorFactory .getOperation(operator) .orElseThrow(() -> new IllegalArgumentException("Invalid Operator")); return targetOperation.apply(a, b); }
枚举方式重构
枚举实现Operator.java
publicenum Operator { ADD { @Override publicintapply(int a, int b){ return a + b; } }, MULTIPLY { @Override publicintapply(int a, int b){ return a * b; } }, SUBTRACT { @Override publicintapply(int a, int b){ return a - b; } }, DIVIDE { @Override publicintapply(int a, int b){ return a / b; } }, MODULO { @Override publicintapply(int a, int b){ return a % b; } }; publicabstractintapply(int a, int b); }
封装Operator到Calculator.java
publicintcalculate(int a, int b, Operator operator){ return operator.apply(a, b); }
使用示例
@Test publicvoidwhenCalculateUsingEnumOperator_thenReturnCorrectResult(){ Calculator calculator = new Calculator(); int result = calculator.calculate(3, 4, Operator.valueOf("ADD")); assertEquals(7, result); }
public Result process(Expression expression){ Rule rule = rules.stream() .filter(r -> r.evaluate(expression)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule")); return rule.getResult(); } }
测试demo
@Test publicvoidwhenNumbersGivenToRuleEngine_thenReturnCorrectResult(){ Expression expression = new Expression(5, 5, Operator.ADD); RuleEngine engine = new RuleEngine(); Result result = engine.process(expression); assertNotNull(result); assertEquals(10, result.getValue()); }