Java设计模式实战:策略模式(Strategy Pattern)详解与示例

蓝鲸
蓝鲸
发布时间:2026-10-16| 7人浏览过
原创

策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换。该模式让算法的变化独立于使用它的客户端,常用于替代复杂的条件分支判断,实现运行时的动态行为切换。

背景与问题

在软件开发中,许多功能存在多种实现方式(如排序算法、支付渠道选择等)。传统的硬编码(Hard Coding)方法通常将这些逻辑集中在一个类中,通过 if-else 或 switch-case 进行条件判断。

这种做法面临以下核心问题:

  • 维护困难:新增一种算法需修改原有类代码,违反开闭原则。
  • 代码庞大:随着策略增多,类内部逻辑变得臃肿,难以阅读和测试。
  • 耦合度高:算法逻辑与调用环境紧密绑定,无法独立复用。

策略模式的核心目标是:让算法和对象分开来,使得算法可以独立于使用它的客户而变化。

方案与结构

策略模式将经常改变的部分提取为接口,并在类中包含该接口的实例引用。在运行时,通过注入不同的实现对象,即可动态改变类的行为。

模式组成

  1. 环境类 (Context):维护对策略对象的引用,负责协调调用。它不关心具体算法细节,只通过公共接口触发执行。
  2. 抽象策略类 (Strategy):定义所有支持算法的公共接口(通常为接口或抽象类),约束具体策略必须实现的方法。
  3. 具体策略类 (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设计模式策略模式的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。