Java设计模式实战:策略模式(Strategy Pattern)详解与示例
策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换。该模式让算法的变化独立于使用它的客户端,常用于替代复杂的条件分支判断,实现运行时的动态行为切换。
背景与问题
在软件开发中,许多功能存在多种实现方式(如排序算法、支付渠道选择等)。传统的硬编码(Hard Coding)方法通常将这些逻辑集中在一个类中,通过 if-else 或 switch-case 进行条件判断。
这种做法面临以下核心问题:
- 维护困难:新增一种算法需修改原有类代码,违反开闭原则。
- 代码庞大:随着策略增多,类内部逻辑变得臃肿,难以阅读和测试。
- 耦合度高:算法逻辑与调用环境紧密绑定,无法独立复用。
策略模式的核心目标是:让算法和对象分开来,使得算法可以独立于使用它的客户而变化。
方案与结构
策略模式将经常改变的部分提取为接口,并在类中包含该接口的实例引用。在运行时,通过注入不同的实现对象,即可动态改变类的行为。
模式组成
- 环境类 (Context):维护对策略对象的引用,负责协调调用。它不关心具体算法细节,只通过公共接口触发执行。
- 抽象策略类 (Strategy):定义所有支持算法的公共接口(通常为接口或抽象类),约束具体策略必须实现的方法。
- 具体策略类 (ConcreteStrategy):实现抽象策略定义的接口,包含具体的算法逻辑。每个类代表一种独立的解决方案。
应用场景
- 多个类仅在行为上有所区别时,使用策略模式将行为差异分离。
- 需要避免使用复杂的多重条件判断语句(如巨大的
if-else链)。 - 需要一个类动态地在几种算法中选择一种的情况。
Java 代码实现示例
为了直观理解,我们以“赵云带锦囊妙计”为例。场景中包含:三个锦囊(具体策略)、一个锦囊袋(环境类 Context)、赵云(调用者)。
第1步:定义抽象策略接口
确立行为的通用签名,所有具体策略必须实现此接口。
public interface Strategy {
void operate();
}
第2步:实现具体策略类
分别实现三种不同的锦囊妙计(算法逻辑)。
// 妙计一:找乔国老帮忙
public class BackDoor implements Strategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
// 妙计二:求吴国太放行
public class GivenGreenLight implements Strategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行");
}
}
// 妙计三:孙夫人断后
public class BlackEnemy implements Strategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
第3步:构建环境类 Context
Context 持有 Strategy 引用,并通过构造函数或 Setter 方法注入具体策略,提供统一的操作入口。
public class Context {
private Strategy strategy;
// 构造函数注入策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
// 运行时动态切换策略
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
// 委托调用具体策略
public void operate() {
this.strategy.operate();
}
}
第4步:客户端调用演示
赵云根据当前局势,动态选择不同的锦囊(策略)执行操作。
public class ZhaoYunDemo {
public static void main(String[] args) {
Context context;
// 刚到吴国,使用第一个锦囊
System.out.println("---刚到吴国---");
context = new Context(new BackDoor());
context.operate();
// 刘备乐不思蜀,使用第二个锦囊
System.out.println("---刘备乐不思蜀---");
context.setStrategy(new GivenGreenLight());
context.operate();
// 遇到追兵,使用第三个锦囊
System.out.println("---遭遇追兵---");
context.setStrategy(new BlackEnemy());
context.operate();
}
}
优缺点分析
优点
- 符合开闭原则:新增策略只需添加新类并实现接口,无需修改现有代码或 Context 类。
- 消除条件语句:将多重条件判断转化为对象组合,降低循环复杂度。
- 行为易替换:可在运行时灵活切换行为。
缺点
- 策略类膨胀:每个算法都需要一个独立的具体类,可能导致系统中类数量增加。
- 客户端认知负担:调用方必须了解有哪些具体策略类,并自行决定何时使用哪个策略(可通过工厂模式进一步简化)。
总结
策略模式通过“组合优于继承”的思想,成功将算法的实现与使用分离。在处理多变的业务逻辑时,它能显著提升代码的可读性和可维护性。以上就是Java设计模式之策略模式示例详解的详细内容,更多关于Java设计模式策略模式的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









