设计模式——策略模式(Strategy)

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态地改变一个对象的行为。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

策略模式的主要组成部分:

  1. 策略接口(Strategy):这是一个抽象策略类,通常由一个接口或抽象类实现。它声明了可供客户端调用的方法,以访问一个具体的策略对象。
  2. 具体策略类(ConcreteStrategy):这些类实现了策略接口,封装了具体的算法或行为。
  3. 上下文(Context):上下文类持有一个策略对象的引用。在上下文类中,通常包含一个策略接口类型的成员变量和一个设置该成员变量的方法(setter)。客户端通过调用这个设置方法来改变上下文对象的策略。上下文类还会提供一个与策略接口方法签名相同的方法,该方法内部会调用所包含的策略对象的方法。

策略模式的优点:

  1. 算法自由切换:策略模式允许在运行时动态地改变一个对象的行为,这使得算法可以自由切换。
  2. 开闭原则:策略模式遵循开闭原则,即对扩展开放,对修改封闭。你可以在不修改已有代码的情况下,通过增加新的策略类来扩展系统的功能。
  3. 减少if-else语句:策略模式可以有效地减少使用if-else语句或switch-case语句,使得代码更加清晰、易于维护。

策略模式的应用场景:

  1. 多种算法:当一个系统有多种算法,并且这些算法经常相互替换时,可以使用策略模式。
  2. 行为变化:如果一个类的行为在多种情况下需要变化,而且这些行为在运行时需要根据条件动态地改变,那么可以使用策略模式。
  3. 避免使用多重条件判断:当系统中出现多重条件判断语句时,可以考虑使用策略模式来替代这些条件判断语句。

示例代码(Java):

java 复制代码
// 策略接口
public interface Strategy {
    int doOperation(int num1, int num2);
}

// 具体策略类A
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

// 具体策略类B
public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

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

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

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    }
}

在这个示例中,我们定义了一个策略接口Strategy和两个具体策略类OperationAddOperationSubtract。我们还定义了一个上下文类Context,它持有一个策略对象的引用,并提供了一个方法来执行该策略。在客户端代码中,我们通过创建不同的上下文对象来改变策略,并执行相应的操作。

相关推荐
Zane19941 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫2 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19942 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19943 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..4 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1504 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)4 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki5 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅665 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa5 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio