设计模式:策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。在策略模式中,将不同的算法封装成独立的策略类,可以根据需要动态地切换或选择不同的策略,而不需要修改客户端代码。

策略模式的核心思想是将算法的定义和使用分离开来,使得它们可以独立变化。它由三个主要角色组成:

  1. Context(上下文): 上下文类是策略模式中的环境类,它负责与客户端进行交互。上下文类内部持有一个策略接口的引用,并在需要调用算法时,通过策略接口调用具体的策略类。

  2. Strategy(策略): 策略接口是策略模式的核心,它定义了具体策略类所需实现的方法。不同的策略类实现相同的策略接口,但提供不同的具体算法实现。

  3. Concrete Strategy(具体策略): 具体策略类实现了策略接口,并提供了具体的算法实现。在上下文环境中,根据需要选择使用的具体策略类。

使用策略模式可以提高代码的可维护性和扩展性,因为不同的算法实现被封装在独立的策略类中,可以独立地进行修改、测试和扩展。它也符合开闭原则,即对扩展开放,对修改关闭。

总结起来,策略模式通过将算法封装成独立的策略类,可以在运行时动态地选择和切换不同的算法,提高代码的灵活性和可扩展性。


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

首先,定义一个策略接口(Strategy):

java 复制代码
public interface Strategy {
    void execute();
}

然后,实现具体的策略类:

java 复制代码
public class ConcreteStrategy1 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略1");
    }
}

public class ConcreteStrategy2 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略2");
    }
}

接下来,创建上下文类(Context):

java 复制代码
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

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

    public void executeStrategy() {
        strategy.execute();
    }
}

最后,可以在客户端中使用策略模式:

java 复制代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategy1());
        context.executeStrategy(); // 输出:执行策略1

        context.setStrategy(new ConcreteStrategy2());
        context.executeStrategy(); // 输出:执行策略2
    }
}

在上面的示例中,我们定义了两个具体的策略类(ConcreteStrategy1和ConcreteStrategy2),它们都实现了策略接口(Strategy)。然后,我们通过上下文类(Context)来使用不同的策略,可以通过调用setStrategy()方法来切换策略,并通过executeStrategy()方法来执行具体的策略。

这样,我们就可以在运行时选择不同的策略,而不需要修改客户端的代码。这就是策略模式的核心思想。

相关推荐
剧中有戏11 小时前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客15 小时前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o17 小时前
设计模式 18 · 状态模式
设计模式·状态模式
莫得感情 o17 小时前
设计模式 17 · 责任链模式
设计模式·责任链模式
用户938515635071 天前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
今天的砖头有点烫手啊2 天前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
董员外2 天前
RAG 系统进化论(十):可运营 RAG,从原型到长期运行的知识系统
人工智能·后端·设计模式
神奇霸王龙2 天前
AgentDesk 配置 Codex+ selltoken 中转 API 实测教程(2026 年 8 月更新)
人工智能·ai·ai编程·策略模式·codex·agentdesk
莫得感情 o2 天前
设计模式 15 · 模板方法模式
设计模式·模板方法模式