修改if-else到策略模式

我在java中有以下if-else分支。

if (str.equals("a")) { A;} else if (str.equals("b")) { B;} else if (str.equals("c")) { C;} else if (str.length == 5) { D;} else { E;} 

如何将此代码修改为策略模式?

这里是使用工厂的策略模式的示例:

 public interface Strategy { public Object[] execute(Object[] args); } public class StrategyFactory { public enum Name { REVERSE, STRINGIFY, DUPLICATE; } private StrategyFactory() { // never instantiate; only use static factory methods } public static Strategy getStrategyReverse() { return new Strategy() { public Object[] execute(Object[] args) { Object[] reversed = new Object[args.length]; for (int i = 0; i < args.length; i++) { reversed[i] = args[args.length - i - 1]; } return reversed; } }; } public static Strategy getStrategyStringify() { return new Strategy() { public Object[] execute(Object[] args) { String[] stringified = new String[args.length]; for (int i = 0; i < args.length; i++) { stringified[i] = String.valueOf(args[i]); } return stringified; } }; } public static Strategy getStrategyDuplicate() { return new Strategy() { public Object[] execute(Object[] args) { Object[] duplicated = new Object[2 * args.length]; for (int i = 0; i < args.length; i++) { duplicated[i * 2] = args[i]; duplicated[i * 2 + 1] = args[i]; } return duplicated; } }; } public static Strategy getStrategy(String name) { return getStrategy(Name.valueOf(name)); } public static Strategy getStrategy(Name name) { switch (name) { case REVERSE: return getStrategyReverse(); case STRINGIFY: return getStrategyStringify(); case DUPLICATE: return getStrategyDuplicate(); default: throw new IllegalStateException("No strategy known with name " + name); } } } public class Main { public static void main(String[] args) { Strategy strategy = StrategyFactory.getStrategy("DUPLICATE"); System.out.println(Arrays.toString(strategy.execute(args))); } } 

你必须考虑面向对象的编程。 使用多态性。 对于策略模式,定义接口并为实现接口的类提供不同的实现。 选择上下文并以变形方式决定类。 http://en.wikipedia.org/wiki/Strategy_pattern

但是对于你的if-else ,正确的模式对应于’Factory Pattern’。 http://en.wikipedia.org/wiki/Factory_method_pattern