抽象类在策略模式中充当协调者而非策略管理者,它封装共性逻辑并委托策略接口执行核心算法;策略实例应外部注入,避免内部硬编码;Spring中可结合IOC容器实现策略自动装配与动态调度。

在 Java 中,抽象类本身不能直接“管理”策略,但它可以作为策略模式中的环境类(Context)或辅助基类,配合策略接口协同工作——关键不在于“抽象类统一管理”,而在于用抽象类封装共性逻辑,把变化点交给策略接口去实现。
抽象类作为策略容器的协调者
抽象类不直接持有具体算法,但可以定义统一入口、预处理/后处理逻辑、上下文参数校验等,再委托给注入的策略对象执行核心计算或校验。例如:
- 定义一个
abstract class RuleProcessor<T>,含通用字段(如规则ID、生效时间、错误码前缀)和模板方法process(input) - 该模板方法内调用
validateInput()(由子类或默认实现)、executeStrategy(input)(抽象方法,留给子类绑定具体策略)、formatResult()(可选钩子) - 子类只需继承并传入某个
RuleStrategy实例,无需重复写流程骨架
抽象类 + 策略接口的典型组合结构
真正承担“规则多样性”的是策略接口及其多个实现,抽象类只做衔接与复用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
策略接口:如
interface ValidationRule { boolean check(Object data); String getErrorMessage(); } -
抽象处理器:如
abstract class BaseValidationProcessor { protected final ValidationRule rule; ... public final Result validate(Object data) { if (preCheck(data)) return rule.check(data) ? success() : fail(rule.getErrorMessage()); } } -
具体子类:如
class MobileFormatValidator extends BaseValidationProcessor { public MobileFormatValidator() { super(new RegexBasedRule("^1[3-9]\d{9}$")); } }
避免把策略逻辑硬塞进抽象类
如果在抽象类里用 if-else 判断类型再 new 不同策略,就违背了策略模式本意。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 策略实例应由外部注入(构造器/Setter),或通过工厂获取,而不是在抽象类内部 new
- 抽象类不关心“该用哪个策略”,只关心“怎么安全、一致地调用它”
- 新增规则时,只需新增一个策略实现类 + 对应的子类(或直接使用策略工厂,跳过子类)
结合 Spring 的轻量级管理方式
在 Spring 环境中,更推荐让抽象类退为普通组件,策略交由 IOC 容器托管:
- 所有
ValidationRule实现类加@Component,并标注@Qualifier("mobileRule")等标识 - 抽象类改为
@Service,通过@Autowired private Map<string validationrule> ruleMap</string>自动聚合全部策略 - 运行时根据业务码(如
"user_register")查出对应策略,委托执行 —— 抽象类此时是调度中枢,不是规则容器

















