【地铁上的设计模式】--行为型模式:策略模式

2023-05-13 14:45:28 浏览数 (1)

什么是策略模式

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。这种模式通过定义一系列算法,并将每个算法封装到一个独立的类中,使得它们可以相互替换。通过这种方式,客户端可以根据需要选择要使用的算法,而不必与特定算法相关的实现细节耦合在一起。 策略模式适用于需要根据特定条件在多种算法之间进行切换的场景。它可以使代码更具可读性和可维护性,同时还能提高代码的灵活性和可扩展性。它还可以将算法的实现细节与客户端代码分离开来,从而使得算法可以更容易地进行修改和维护。 然而,使用策略模式可能会导致类的数量增加,从而增加代码的复杂性。此外,使用策略模式时,客户端必须了解不同策略之间的区别,以便能够选择正确的策略。因此,策略模式适用于复杂的场景,而不适用于简单的问题。

如何实现策略模式

策略模式的实现步骤如下:

  1. 定义策略接口:定义一组算法的公共接口,该接口声明了算法的输入、输出及算法方法。
  2. 实现具体策略类:具体实现策略接口中的算法方法,并提供一些算法实现的具体细节。
  3. 定义上下文类:上下文类负责维护对策略对象的引用,同时将客户端请求委派给具体的策略对象进行处理。
  4. 注入具体策略对象:客户端根据具体的需求选择并创建具体策略对象,然后将其注入到上下文类中。

通过策略模式的实现,可以使算法的实现和调用过程相分离,使得算法更加灵活、可维护和可扩展,同时也提高了代码的复用率。

Java实现 以下是Java语言中实现策略模式的示例代码:

代码语言:javascript复制
// 策略接口
public interface Strategy {
    int calculate(int num1, int num2);
}
// 策略实现类
public class AddStrategy implements Strategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1   num2;
    }
}
public class SubtractStrategy implements Strategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 - num2;
    }
}
// 策略上下文
public class CalculationContext {
    private Strategy strategy;
    public CalculationContext(Strategy strategy) {
        this.strategy = strategy;
    }
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public int executeStrategy(int num1, int num2) {
        return strategy.calculate(num1, num2);
    }
}

// 调用示例
public static void main(String[] args) {
    CalculationContext context = new CalculationContext(new AddStrategy());
    int result = context.executeStrategy(5, 3); // 调用加法策略,得到8
    System.out.println(result);
    context.setStrategy(new SubtractStrategy());
    result = context.executeStrategy(5, 3); // 调用减法策略,得到2
    System.out.println(result);
}

在这个示例中,策略接口 Strategy 定义了一个 calculate 方法,该方法接受两个整数参数并返回计算结果。然后我们定义了两个具体的策略类 AddStrategySubtractStrategy,它们分别实现了加法和减法运算。策略上下文 CalculationContext 封装了一个策略对象,并提供了一个 executeStrategy 方法,它使用传入的策略对象执行计算操作。在调用示例中,我们创建了一个 CalculationContext 对象并传入一个加法策略,然后调用 executeStrategy 方法计算 5 3,得到结果 8。接着我们将策略切换成减法策略,并再次调用 executeStrategy 方法计算 5 - 3,得到结果 2。

C#实现 以下是C#实现策略模式的示例代码:

代码语言:javascript复制
using System;

// 策略接口
interface IStrategy {
    void Execute();
}

// 策略1
class ConcreteStrategy1 : IStrategy {
    public void Execute() {
        Console.WriteLine("执行策略1");
    }
}

// 策略2
class ConcreteStrategy2 : IStrategy {
    public void Execute() {
        Console.WriteLine("执行策略2");
    }
}

// 策略上下文
class Context {
    private IStrategy _strategy;

    public Context(IStrategy strategy) {
        this._strategy = strategy;
    }

    public void ExecuteStrategy() {
        this._strategy.Execute();
    }
}

// 测试代码
class Program {
    static void Main(string[] args) {
        // 使用策略1
        var context = new Context(new ConcreteStrategy1());
        context.ExecuteStrategy();

        // 使用策略2
        context = new Context(new ConcreteStrategy2());
        context.ExecuteStrategy();
    }
}

在上述代码中,我们定义了一个 IStrategy 接口,表示策略的抽象。具体的策略实现了这个接口,并实现了 Execute 方法,在这个方法中实现具体的策略逻辑。Context 类表示策略的上下文,在它的构造函数中接收一个 IStrategy 对象,表示当前采用的策略,然后在 ExecuteStrategy 方法中调用当前策略的 Execute 方法。在测试代码中,我们可以通过 new 关键字创建不同的具体策略,并通过 Context 对象来使用它们的具体实现。

总结

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过将算法封装在可互换的策略对象中,该模式使得客户端可以动态地改变应用程序的行为。该模式的优点包括增强了程序的可扩展性和灵活性,让算法的变化独立于其他部分的变化,使得代码更加易于维护和测试。缺点是需要多个策略对象,这可能会增加代码的复杂度,同时需要客户端理解不同策略的作用和适用条件。

0 人点赞