策略模式的轻量级实现

5/29/2024 工作工作经验设计模式

策略模式的轻量级实现

# 简介

策略模式大家也已经听了不少了。我们很多业务系统代码中随处可见的策略模式实现套路,策略模式简单来说一个接口+不同实现即可实现一个策略模式。这样的实现方式在一些上层服务或者门面系统中使用的确算得上优雅,但是对于一些底层的、领域核心的服务,使用这样传统的接口类级别的策略模式实现方式显得略显笨重。那么有没有一种更轻量级的实现方式呢?答案当然是肯定的。接下来介绍一些策略模式的轻量级实现。

# 策略模式的轻量级实现

当觉得类级别的策略路由分发比较重,那么更轻量级的必然就是方法级的策略路由。我们最熟悉的 if else 中调用接口的不同方法进行不同场景的业务逻辑处理可以说是鼻祖级的轻量级路由,我们只要通过某种方式将这样的 if else 调方法替换成更优雅的调用方式,那就完全可以称作是一种轻量级的策略模式实现。那么问题来了,如果实现呢? 熟悉 Java8 的人或许都使用过或者能立马想到一种方式,那就是通过函数式接口 + Map优雅地完成这项工作。

代码示例

@Service
@RequiredArgsConstructor
public class TestCaseImpl {
    private final Map<String, Function<ReqVO, ResVO>> functionMap = new HashMap<>();
    private final TestService testService;


    @PostConstruct
    public void initFunctionMap() {
        functionMap.put(BizCodeEnum.OPEN_ACCOUNT.getCode(), testService::open);
        functionMap.put(BizCodeEnum.CLOSE_ACCOUNT.getCode(), testService::close);
    }
    public ResVO process(ReqVO reqVO) {
        ResVO resVO = getFunction(reqVO.getAccBizCode()).apply(reqVO);
        //其他操作
        return resVO;
    }

    private Function<ReqVO, ResVO> getFunction(String accBizCode) {
        return Optional.ofNullable(functionMap.get(accBizCode)).orElseThrow(() -> new RuntimeException("不支持的操作场景:" + accBizCode));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

很简单的一段代码,将不同场景需要执行的函数缓存在本地键值对中,执行的时候直接通过场景码映射寻找对应的函数并执行。 实现轻量级策略模式可用的常见函数式接口:java.util.function.Function、java.util.function.Consumer、java.util.function.Supplier、java.util.function.BooleanSupplier、java.lang.Runnable等,可按需选择。

# 适用场景

  1. 同属于一个领域的函数服务按场景路由调用时。
  2. 比较底层的方法,考虑替代 if else
  3. 具有相同类型出入参的不同函数路由调用时(当然不同类型出入参也可以,只不过有可能避免不了出现一些类型强转的地方)。