Java枚举可直接实现策略接口,每个枚举常量通过匿名内部类重写方法,天然具备单例、线程安全、不可变和可序列化特性;支持构造器注入配置字段,避免逻辑与配置分离。

Java 枚举可以直接作为策略的实现者,无需额外定义类或接口实现类,关键在于让枚举实现策略接口,并在每个枚举常量中重写抽象方法——这利用了枚举实例天然的“单例+可携带行为”特性。
定义统一策略接口
先声明一个函数式接口(或普通接口),封装策略要执行的核心逻辑。例如处理不同支付方式:
public interface PaymentStrategy {
void process(double amount);
}枚举实现接口并重写方法
枚举类型直接 implements 该接口,每个枚举值通过匿名内部类语法(即大括号内重写方法)提供专属行为:
public enum PaymentType implements PaymentStrategy {
ALIPAY {
@Override
public void process(double amount) {
System.out.println("使用支付宝支付: ¥" + amount);
}
},
WECHAT_PAY {
@Override
public void process(double amount) {
System.out.println("使用微信支付: ¥" + amount);
}
},
BANK_TRANSFER {
@Override
public void process(double amount) {
System.out.println("使用银行转账: ¥" + amount);
}
};
}每个枚举常量都是独立对象,自带完整策略逻辑,天然线程安全、不可变、可序列化。
运行时按需选取并执行策略
调用方只需根据业务参数获取对应枚举实例,直接调用其方法即可,无需 if-else 或 switch 分支:
- 通过字符串查找:
PaymentType.valueOf("ALIPAY").process(199.9) - 封装为工厂方法(更健壮):
public static PaymentStrategy of(String type) {<br> return PaymentType.valueOf(type.toUpperCase());<br>} - 结合业务上下文传参,比如订单类型决定支付策略,直接
paymentType.process(order.getAmount())
扩展策略行为(带状态或参数)
若策略需要额外字段(如手续费率、渠道 ID),可在枚举中声明构造器和私有字段:
public enum PaymentType implements PaymentStrategy {
ALIPAY(0.001), WECHAT_PAY(0.002), BANK_TRANSFER(0.0);
<pre class="brush:php;toolbar:false;">private final double feeRate;
PaymentType(double feeRate) {
this.feeRate = feeRate;
}
@Override
public void process(double amount) {
double fee = amount * feeRate;
System.out.printf("%s 支付 ¥%.2f,手续费 ¥%.2f%n",
name(), amount, fee);
}}
这样每个策略实例既封装逻辑,又持有自身配置,避免策略对象与配置分离带来的维护成本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











