目录
策略模式解决if-else的方式
背景
在应用编程中,经常会根据不同枚举类型执行不同操作,常规的做法通常使用if-else
或者switch-case
的方式解决,如下例子代码:
if ("car".equals(oprType)) {
// drive car
} else if ("bicycle".equals(oprType)) {
// bicycle
} else if ("bus".equals(oprType)) {
// bus
} else {
// train
}
当操作类型扩展时,将不得不继续if-else
,代码更加臃肿,优雅和可读性将大大降低。为了解决这种情况,可以使用下面的几种方式进行重构。
优化
枚举&抽象策略
1. 通过接口进行抽象
将每种类型实际执行的方法通过接口进行抽象定义,如上面例子代码,不同操作类型执行不同的运行方法
interface RunWay {
void run();
}
// ------------------ 三个不同实现类 -----------------------
class Car implements RunWay {
public void run() { System.out.println("car"); }
}
class Bus implements RunWay {
public void run() { System.out.println("bus");}
}
class Train implements RunWay {
public void run() { System.out.println("train"); }
}
2. 使用枚举实现策略
public enum RunTypeEnum {
CAR("car", new Car()),
BUS("bus", new Bus()),
Train("train", new Train())
;
private String type;
private RunWay runWay; // 变量使用接口
RunTypeEnum(String type, RunWay runWay) {
this.type = type;
this.runWay = runWay;
}
// 根据类型获取对应的枚举实例
public static RunTypeEnum getRunTypeEnum(String type) {
return Arrays
.stream(RunTypeEnum.values())
.filter(p -> p.getType().equals(type))
.findFirst()
.orElse(null);
}
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public RunWay getRunWay() { return runWay; }
public void setRunWay(RunWay runWay) { this.runWay = runWay; }
}
3. 通过类型测试调用
public static void process(String type) {
// 不需要在使用if-else方式,后续添加类型,此处代码无需变动
RunWay runWay = RunTypeEnum.getRunTypeEnum(type).getRunWay();
runWay.run();
}
Map&Function
private static Map<String, Function<String, RunWay>> runTypeMap = new HashMap<>();
static {
runTypeMap.put("bus", runtype -> new Bus());
runTypeMap.put("train", runtype -> new Train());
runTypeMap.put("car", runtype -> new Car());
}
public static void process(String type) {
Function<String, RunWay> runwayFunction = runTypeMap.get(type);
if (runwayFunction != null) {
runwayFunction.apply()
}
}
版权所有,本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。转载请注明出处:https://www.wangjun.dev//2022/09/has-no-ifelse/