策略模式通过接口定义算法契约,多个实现类封装具体逻辑,context持接口引用并委托执行,运行时通过多态动态切换策略,新增算法无需修改原有代码。

Java 中策略模式利用接口实现算法替换,核心是把“变”的算法抽成接口,让不同实现类各写各的逻辑,运行时通过多态动态切换——不改调用代码,只换实现类。
定义统一策略接口
先声明一个接口,规定所有策略必须提供的方法签名。它不关心具体怎么做,只约定“能做什么”:
- 接口名通常体现行为意图,比如 PaymentStrategy、DiscountStrategy、SortStrategy
- 方法设计要通用,参数和返回值尽量覆盖多种策略的共性需求,例如:String execute(String input) 或 boolean matches(Employee emp)
- 避免在接口里放策略专属字段或复杂状态,保持轻量和抽象
编写多个具体策略实现类
每个类实现同一接口,封装一种独立算法。它们彼此隔离,互不影响:
- 例如支付场景:AlipayStrategy、WechatPayStrategy、UnionPayStrategy 都实现 PaymentStrategy
- 每个类只专注自身逻辑,比如 AlipayStrategy 内部调支付宝 SDK,WechatPayStrategy 调微信 API
- 新增策略(如 ApplePayStrategy)只需新写一个类,不用动已有代码,也不用改 if-else 分支
用上下文(Context)持有并调用策略
Context 是客户端实际打交道的对象,它内部持有一个策略接口类型的引用:
- 构造时或运行时注入具体策略实例(支持 setter、构造器或 Spring Bean 注入)
- 对外暴露统一方法(如 process()),内部委托给当前持有的策略执行
- 切换策略只需更换传入的实现类对象,例如从 new WechatPayStrategy() 换成 new AlipayStrategy()
运行时灵活替换的关键操作
真正实现“替换”,靠的是面向接口编程 + 多态绑定:
- 声明变量类型为接口(PaymentStrategy strategy),而非某个实现类
- 赋值时指向任意具体实现:strategy = new UnionPayStrategy();
- 调用 strategy.pay(order) 时,JVM 自动执行对应类里的重写方法
- 配合工厂、配置中心或 Spring 的 @Qualifier,还能根据参数自动选策略,完全解耦
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











