文章

避免大量ifelse

通过枚举、工厂模式和策略模式来避免大量的if-else语句。通过定义角色操作接口和实现类,使用不同模式来管理角色的操作逻辑。

避免大量ifelse

避免大量ifelse

枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Test {
    public static void main(String[] args) {
        System.out.println(judge("ROLE_ROOT_ADMIN"));
    }

    public static String judge(String roleName){
        return RoleEnum.valueOf(roleName).operation();
    }
}

interface RoleOperation {
    String operation();
}

enum RoleEnum implements RoleOperation {
    ROLE_ROOT_ADMIN {
        @Override
        public String operation() {
            return "root";
        }
    },
    ROLE_ORDER_ADMIN {
        @Override
        public String operation() {
            return "order";
        }
    },
    ROLE_NORMAL_ADMIN {
        @Override
        public String operation() {
            return "normal";
        }
    };
}

工厂模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        System.out.println(judge("ROLE_ROOT_ADMIN"));
    }

    public static String judge(String roleName) {
        return RoleFactory.getOperation(roleName).operation();
    }
}

interface RoleOperation {
    String operation();
}


class RoleFactory {
    static Map<String, RoleOperation> roleOperationMap = new HashMap<>();

    static {
        roleOperationMap.put("ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN"));
        roleOperationMap.put("ROLE_ORDER_ADMIN", new RootAdminRole("ROLE_ORDER_ADMIN"));
        roleOperationMap.put("ROLE_NORMAL_ADMIN", new RootAdminRole("ROLE_NORMAL_ADMIN"));
    }

    public static RoleOperation getOperation(String name) {
        return roleOperationMap.get(name);
    }
}

class RootAdminRole implements RoleOperation {
    private final String roleName;

    public RootAdminRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " root permission";
    }
}

class OrderAdminRole implements RoleOperation {
    private final String roleName;

    public OrderAdminRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " order permission";
    }
}

class NormalRole implements RoleOperation {
    private final String roleName;

    public NormalRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " normal permission";
    }
}

策略模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package test;

public class Test {
    public static void main(String[] args) {
        System.out.println(judge(new RootAdminRole("ROLE_ROOT_ADMIN")));
    }

    public static String judge(RoleOperation roleOperation) {
        RoleContext roleContext = new RoleContext();
        roleContext.setOperation(roleOperation);
        return roleContext.execute();
    }
}

// 策略
interface RoleOperation {
    // 策略方法
    String operation();
}

// 环境类:持有一个策略类的引用,最终给客户端调用
class RoleContext {
    private RoleOperation roleOperation;

    public void setOperation(RoleOperation roleOperation) {
        this.roleOperation = roleOperation;
    }

    public String execute() {
        return roleOperation.operation();
    }
}

// 具体策略类
class RootAdminRole implements RoleOperation {
    private final String roleName;

    public RootAdminRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " root permission";
    }
}

class OrderAdminRole implements RoleOperation {
    private final String roleName;

    public OrderAdminRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " order permission";
    }
}

class NormalRole implements RoleOperation {
    private final String roleName;

    public NormalRole(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String operation() {
        return roleName + " normal permission";
    }
}
本文由作者按照 CC BY 4.0 进行授权