Java枚举天然适合策略模式:它既能定义有限策略类型,又能封装行为逻辑,避免类泛滥和工厂冗余;枚举实现统一接口并在各实例中重写算法,支持编译期类型安全与零胶水代码调用。

Java 枚举天然适合策略模式:它既能定义有限、明确的策略类型(常量),又能直接封装对应的行为逻辑(方法),避免策略类泛滥和工厂映射冗余。关键在于让枚举实现统一策略接口,并在每个枚举实例中重写具体算法。
定义统一策略接口
先抽象出策略行为,比如一个通用的计算接口:
public interface CalculationStrategy {
int calculate(int a, int b);
}这个接口描述“所有策略都支持两数计算”,不关心具体是加、减还是乘。
枚举实现接口并内聚算法
让枚举直接实现该接口,在每个枚举常量中注入专属逻辑,无需额外类或 if-else 分支:
立即学习“Java免费学习笔记(深入)”;
public enum MathOperation implements CalculationStrategy {
ADD {
@Override
public int calculate(int a, int b) {
return a + b;
}
},
SUBTRACT {
@Override
public int calculate(int a, int b) {
return a - b;
}
},
MULTIPLY {
@Override
public int calculate(int a, int b) {
return a * b;
}
};
<pre class="brush:php;toolbar:false;">// 可选:提供通用入口,增强可读性
public static CalculationStrategy of(String op) {
return switch (op.toUpperCase()) {
case "ADD" -> ADD;
case "SUB" -> SUBTRACT;
case "MUL" -> MULTIPLY;
default -> throw new IllegalArgumentException("Unknown operation: " + op);
};
}}
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 每个枚举值(ADD、SUBTRACT…)本身就是策略实例,状态与行为合一
- 无需维护 StrategyFactory 或 Map
映射表 - 编译期类型安全:传入 MathOperation.ADD 就一定是合法策略,IDE 可自动补全
业务中直接使用,零胶水代码
调用方完全感知不到“策略模式”的设计痕迹,就像调用普通对象方法一样自然:
public class Calculator {
public int execute(String op, int a, int b) {
CalculationStrategy strategy = MathOperation.of(op);
return strategy.calculate(a, b); // 多态分发,自动走对应枚举的实现
}
}如果后续新增 DIVIDE 策略,只需在枚举中追加一项,改一处,编译器立刻检查所有引用是否适配,无遗漏风险。
进阶:为枚举添加元数据与构造逻辑
实际项目中策略常带配置,比如操作符符号、优先级、是否支持浮点等。可在枚举中声明字段,通过构造器初始化:
public enum MathOperation implements CalculationStrategy {
ADD("+", 1) {
public int calculate(int a, int b) { return a + b; }
},
MULTIPLY("*", 2) {
public int calculate(int a, int b) { return a * b; }
};
<pre class="brush:php;toolbar:false;">private final String symbol;
private final int precedence;
MathOperation(String symbol, int precedence) {
this.symbol = symbol;
this.precedence = precedence;
}
// 提供公共访问方法
public String getSymbol() { return symbol; }
public int getPrecedence() { return precedence; }}
这样枚举既是策略执行者,又是策略元数据源,一物两用,干净利落。

















