我在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;}
如何将此代码修改为策略模式?
答案 0 :(得分:9)
以下是使用工厂的策略模式示例:
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)));
}
}
答案 1 :(得分:0)
你必须考虑面向对象的编程。使用多态性。 对于战略模式, 定义接口并为实现接口的类提供不同的实现。选择上下文并以变形方式决定类。 http://en.wikipedia.org/wiki/Strategy_pattern
但是对于if-else
,正确的模式对应于“工厂模式”。
http://en.wikipedia.org/wiki/Factory_method_pattern