丨云

博客园 首页 新随笔 联系 订阅 管理

方法一:表驱动

对于逻辑表达模式固定的 if...else 代码,可以通过某种映射关系,将逻辑表达式用表格的方式表示;再使用表格查找的方式,找到某个输入所对应的处理函数,使用这个处理函数进行运算。

适用场景

逻辑表达模式固定的 if...else

实现与示例

1 if (param.equals(value1)) {
2     doAction1(someParams);
3 } else if (param.equals(value2)) {
4     doAction2(someParams);
5 } else if (param.equals(value3)) {
6     doAction3(someParams);
7 }
8 // ...

可重构为

1 Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型
2 
3 // When init
4 actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
5 actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
6 actionMappings.put(value3, (someParams) -> { doAction3(someParams)});
7 
8 // 省略 null 判断
9 actionMappings.get(param).apply(someParams);

方法二:职责链模式

 介绍

 当 if...else 中的条件表达式灵活多变,无法将条件中的数据抽象为表格并用统一的方式进行判断时,这时应将对条件的判断权交给每个功能组件。并用链的形式将这些组件串联起来,形成完整的功能。

 适用场景

 条件表达式灵活多变,没有统一的形式。

 实现与示例

 职责链的模式在开源框架的 Filter、Interceptor 功能的实现中可以见到很多。下面看一下通用的使用模式:

 重构前:

1 public void handle(request) {
2     if (handlerA.canHandle(request)) {
3         handlerA.handleRequest(request);
4     } else if (handlerB.canHandle(request)) {
5         handlerB.handleRequest(request);
6     } else if (handlerC.canHandle(request)) {
7         handlerC.handleRequest(request);
8     }
9 }

 重构后:

 1 public void handle(request) {
 2   handlerA.handleRequest(request);
 3 }
 4 
 5 public abstract class Handler {
 6   protected Handler next;
 7   public abstract void handleRequest(Request request);
 8   public void setNext(Handler next) { this.next = next; }
 9 }
10 
11 public class HandlerA extends Handler {
12   public void handleRequest(Request request) {
13     if (canHandle(request)) doHandle(request);
14     else if (next != null) next.handleRequest(request);
15   }
16 }

方法三:Optional

 介绍

 Java 代码中的一部分 if...else 是由非空检查导致的。因此,降低这部分带来的 if...else 也就能降低整体的 if...else 的个数。

 Java 从 8 开始引入了 Optional 类,用于表示可能为空的对象。这个类提供了很多方法,用于相关的操作,可以用于消除 if...else。开源框架 Guava 和 Scala 语言也提供了类似的功能。

 使用场景

 有较多用于非空判断的 if...else。

 实现与示例

 传统写法:

1 String str = Hello World!;
2 if (str != null) {
3     System.out.println(str);
4 } else {
5     System.out.println(Null);
6 }

使用 Optional 之后:

1 1 Optional<String> strOptional = Optional.of(Hello World!);
2 2 strOptional.ifPresentOrElse(System.out::println, () -> System.out.println(Null));

 

posted on 2021-04-23 15:44  丨云  阅读(162)  评论(0编辑  收藏  举报