前言
对接物联网设备,设备传递命令,然后根据命令操作不同的行为,最后返回。
现在问题是if else 太多了,代码太长,项目不好维护和扩展,代码如下:
text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static String execute(String command, String jsonStr){
if ("openDoor".equals(command)) {
// 具体业务代码会比较多,这里只是做一个简单的代码框架例子。
return "开门";
} else if ("closeDoor".equals(command)) {
// 业务逻辑代码省略...
return "关门";
} else if ("addUser".equals(command)) {
// 业务逻辑代码省略...
return "添加用户";
} else if ("removeUser".equals(command)) {
// 业务逻辑代码省略...
return "删除用户";
} else if ("addFace".equals(command)) {
// 业务逻辑代码省略...
return "添加人脸";
}
return "未找到命令";
}
方案一:通过枚举来优化
text
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
enum Action {
openDoor(jsonStr -> {
// 业务逻辑代码省略...
return "开门";
}),
closeDoor(jsonStr -> {
// 业务逻辑代码省略...
return "关门";
}),
addUser(jsonStr -> {
// 业务逻辑代码省略...
return "添加用户";
})
// ....
;
private Function<String, String> function;
Action (Function<String, String> function) {
this.function = function;
}
/**
* 提供执行命令的方法
* @param commandStr
* @param jsonStr
* @return
*/
public static String execute(String commandStr, String jsonStr) {
try {
Action action = Action.valueOf(commandStr);
return action.function.apply(jsonStr);
} catch (IllegalArgumentException e) {
}
return "未找到指令";
}
}
// 代码优化成这样
public static String executeTest(String command, String jsonStr){
return Action.execute(command, jsonStr);
}
该段代码去掉了全部的if else,核心利用Enum.valueOf来找到具体的事件并执行。
测试输出:
text
1
2
3
4
5
// 测试枚举类,优化if else
String str = Action.execute("addUser", "");// 添加用户
// String str = Action.execute("test", ""); // 未找到指令
System.out.println(str);
方案二:Map结合函数式编程
使用enum不适用我的业务,我打算将这块封装成一个公共包,但是枚举不能继承只能实现接口,
如果后期扩展用了就需要改枚举,或者重新定义一个枚举(如果给到别人使用还需要沟通好枚举定义规范)。
text
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
interface IAction {
public static Map<String, Function<String, String>> map = new HashMap<>();
// 提供执行的方法封装
public static String execute(String commandStr) {
Function<String, String> function = map.get(commandStr);
if (function == null) {
return "未找到指令";
}
return function.apply(commandStr);
}
}
static {
IAction.map.put("openDoor", jsonObject -> {
// 业务逻辑代码省略...
return "开门";
});
IAction.map.put("closeDoor", jsonObject -> {
// 业务逻辑代码省略...
return "关门";
});
IAction.map.put("addUser", jsonObject -> {
// 业务逻辑代码省略...
return "添加用户";
});
}
text
1
2
3
4
// 测试Map 函数式编程
String addUser = IAction.execute("addUser");
System.out.println(addUser);
其它
可以结合工厂模式 + 策略模式,本文不做描述。使用这两种设计模式缺点:需要添加接口和定义很多类会使系统变的复杂。
另外设计模式的诞生是在Java早期语法糖不丰富用来优化代码的,现在Java新特性之后可以替代部分设计模式。
如:枚举可以替代单例模式。





评论
登录后即可评论
分享你的想法,与作者互动
暂无评论