策略模式
解析代码:public class CalculateServiceImpl {
@Resource private List<CalculateHandler> handlers;
private Map<String, CalculateHandler> handlersMap;
@PostConstruct public void init() {
handlersMap = handlers.stream().collect(Collectors.toMap(CalculateHandler::getKey, Function.identity(), (v1, v2) -> v1));
}
非拉姆达写法:
handlersMap = handlers.stream()
.collect(Collectors.toMap(
new Function<CalculateHandler, String>() {
@Override
public String apply(CalculateHandler handler) {
return handler.getKey();
}
},
new Function<CalculateHandler, CalculateHandler>() {
@Override
public CalculateHandler apply(CalculateHandler handler) {
return handler; // Function.identity()
}
},
new BinaryOperator<CalculateHandler>() {
@Override
public CalculateHandler apply(CalculateHandler v1, CalculateHandler v2) {
return v1; // 冲突时保留第一个
}
}
));
CalculateHandler 实现类注册到一个 Map 中,以便后续根据 key 快速查找对应的处理器。✅ 逐行解析
public class CalculateServiceImpl {
-
这是一个服务实现类,可能是某个计算服务的具体实现。
@Resource
private List<CalculateHandler> handlers;
-
使用
@Resource(Spring 支持的注解)注入 所有实现了CalculateHandler接口的 Bean。 -
Spring 会自动收集容器中所有
CalculateHandler类型的 Bean,组成一个List注入进来。 -
这是 策略模式 的典型用法:每个
CalculateHandler实现类代表一种计算策略。
private Map<String, CalculateHandler> handlersMap;
-
用于存储
key -> CalculateHandler的映射关系。 -
目的是后续可以通过
key快速获取对应的处理器,避免遍历List。
@PostConstruct
public void init() {
-
@PostConstruct表示 在依赖注入完成后自动执行 的方法。 -
用于初始化
handlersMap。
handlersMap = handlers.stream()
.collect(Collectors.toMap(
CalculateHandler::getKey, // key 提取器
Function.identity(), // value 就是 handler 本身
(v1, v2) -> v1 // 如果 key 重复,保留第一个
));
-
将
List<CalculateHandler>转换为Map<String, CalculateHandler>。 -
CalculateHandler::getKey:每个 handler 提供一个getKey()方法,返回其唯一标识。 -
Function.identity():value 就是 handler 本身。 -
(v1, v2) -> v1:如果两个 handler 的key相同,保留第一个,忽略后面的。
✅ 总结一句话
这段代码的作用是:在 Spring 启动时,自动收集所有CalculateHandler实现类,并以getKey()的返回值为键,构建一个映射表,方便后续根据 key 快速获取对应的处理器。
✅ 举个例子
public interface CalculateHandler {
String getKey();
BigDecimal calculate(BigDecimal a, BigDecimal b);
}
@Component
class AddHandler implements CalculateHandler {
public String getKey() { return "ADD"; }
public BigDecimal calculate(BigDecimal a, BigDecimal b) { return a.add(b); }
}
@Component
class SubtractHandler implements CalculateHandler {
public String getKey() { return "SUB"; }
public BigDecimal calculate(BigDecimal a, BigDecimal b) { return a.subtract(b); }
}
init() 执行后:handlersMap = {
"ADD" -> AddHandler,
"SUB" -> SubtractHandler
}
✅ 后续使用示例
public BigDecimal execute(String key, BigDecimal a, BigDecimal b) {
CalculateHandler handler = handlersMap.get(key);
if (handler == null) throw new IllegalArgumentException("Unsupported key: " + key);
return handler.calculate(a, b);
}
✅ 小结
| 元素 | 作用 |
|---|---|
@Resource List<CalculateHandler> |
收集所有策略实现 |
@PostConstruct init() |
初始化策略映射表 |
Collectors.toMap(...) |
构建 key -> handler 的映射 |
getKey() |
每个策略的唯一标识 |
CalculateHandler 的源码,我可以帮你看看它的 getKey() 是怎么实现的。

浙公网安备 33010602011771号