设计模式——策略模式(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,它持有一个策略对象的引用,并提供了一个方法来执行该策略。在客户端代码中,我们通过创建不同的上下文对象来改变策略,并执行相应的操作。

相关推荐
也无晴也无风雨12 分钟前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉9 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点10 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰10 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus10 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵10 小时前
设计模式-迭代器
设计模式
lexusv8ls600h12 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc14 小时前
抽象工厂模式
java·设计模式·抽象工厂模式
无敌岩雀17 小时前
C++设计模式结构型模式———外观模式
c++·设计模式·外观模式
hxj..18 小时前
【设计模式】观察者模式
java·观察者模式·设计模式