策略模式(Strategy Pattern)

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

策略模式的核心组成部分:

  1. Context(上下文)

    上下文是使用策略的对象,它持有一个对策略接口的引用,并将具体的算法执行委托给策略对象。

  2. Strategy(策略接口)

    定义了一个公共接口,所有具体策略类都需要实现这个接口。

  3. ConcreteStrategy(具体策略)

    每个具体策略类实现了策略接口,提供了具体的算法实现。


策略模式的应用场景

  • 支付系统:不同的支付方式(信用卡、PayPal、比特币等)可以作为不同的策略。
  • 排序算法:在数据处理中,根据需求选择不同的排序算法(快速排序、归并排序、冒泡排序等)。
  • 地图导航:提供多种路径规划策略(最短路径、最少时间、避开收费路段等)。
  • 游戏AI:不同难度级别的敌人AI可以采用不同的策略。

示例代码(Java)

以下是一个简单的策略模式实现示例:

java 复制代码
// 策略接口
interface Strategy {
    int execute(int a, int b);
}

// 具体策略A:加法
class ConcreteStrategyAdd implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

// 具体策略B:减法
class ConcreteStrategySubtract implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

// 具体策略C:乘法
class ConcreteStrategyMultiply implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

// 测试策略模式
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context();

        // 使用加法策略
        context.setStrategy(new ConcreteStrategyAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        // 使用减法策略
        context.setStrategy(new ConcreteStrategySubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        // 使用乘法策略
        context.setStrategy(new ConcreteStrategyMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

输出结果

复制代码
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

优点

  1. 单一职责原则:每个策略类只负责一个具体的算法实现,使代码更加清晰。
  2. 开闭原则:新增策略时无需修改现有代码,只需添加新的具体策略类即可。
  3. 消除条件语句 :避免了在上下文中使用大量的 if-else 或 switch-case 语句来选择算法。

缺点

  1. 类数量增加:每种策略都需要一个具体策略类,可能会导致类的数量显著增加。
  2. 客户端需了解策略:客户端需要了解不同的策略类及其用途,增加了使用的复杂性。

相关推荐
AIex-YH1 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy2 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up6 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding8 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life9 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市203010 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax11 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码11 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx12 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp
博风12 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式