Update avaliable. Click RELOAD to update.
目录

策略模式解决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/

Related posts