Java中的策略模式(Strategy Pattern)

策略模式是一种行为设计模式,允许你定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式使得算法独立于使用它们的客户端。

1. 策略模式的结构

策略模式通常由以下几个角色组成:

  • 上下文(Context):持有对某个策略对象的引用,通常通过构造函数或者setter方法来注入所需的具体策略。
  • 策略接口(Strategy):定义一个接口以供不同的策略实现。
  • 具体策略(ConcreteStrategy):实现策略接口的具体类,这些类提供了不同的算法。

策略模式的优点包括:

  1. 算法的独立性:策略可以独立于客户端而变化。
  2. 增加新的策略方便:新策略的引入不影响现有代码。
  3. 清晰的代码结构:策略类分离,使得代码更清晰和可维护。

2. 类图示例

以下是策略模式的类图:

classDiagram
    class Context {
        -Strategy strategy
        +setStrategy(Strategy strategy)
        +executeStrategy(data)
    }
    
    class Strategy {
        <<interface>>
        +execute(data)
    }
    
    class ConcreteStrategyA {
        +execute(data)
    }
    
    class ConcreteStrategyB {
        +execute(data)
    }
    
    Context --> Strategy
    Strategy <|-- ConcreteStrategyA
    Strategy <|-- ConcreteStrategyB

3. 代码示例

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

// 策略接口
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;
    }
}

// 上下文类
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));
    }
}

4. 状态图示例

策略模式的状态转变可以用状态图表示:

stateDiagram
    [*] --> ConcreteStrategyAdd
    ConcreteStrategyAdd --> ConcreteStrategySubtract : changeStrategy()
    ConcreteStrategySubtract --> ConcreteStrategyAdd : changeStrategy()

5. 总结

策略模式通过将不同的算法封装为独立的策略类,允许客户端在运行时选择任意一种策略。这种方式增加了代码的复用性和可维护性,使得代码结构更加清晰。在需要频繁切换算法的场景中,策略模式是一个非常合适的解决方案。例如,在支付方式选择、图形绘制算法等场景中,策略模式的灵活性使其成为设计的重要工具。希望本文能够帮助你理解和掌握Java中的策略模式。