将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)));
}
}