策略模式是一种行为设计模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式特点

  • 开闭原则:策略模式符合开闭原则,因为算法的修改不会影响到使用算法的客户。
  • 替换原则:策略模式允许算法的变化独立于使用算法的客户。
  • 封装原则:策略模式将算法封装在各自的类中,降低算法之间的耦合。

策略模式结构

  • Context(环境类):维护一个策略对象的引用,负责策略对象的创建和切换。
  • Strategy(策略接口):定义所有支持的算法的公共接口。
  • ConcreteStrategyA(具体策略A):实现Strategy接口,定义算法的具体实现。
  • ConcreteStrategyB(具体策略B):实现Strategy接口,定义算法的具体实现。

使用场景

  • 有多个算法,且算法相互独立,无需关心算法之间的具体实现
  • 算法需要根据不同的情况选择使用
  • 需要动态切换算法

示例

假设我们要设计一个排序算法,根据不同的需求,可以选择不同的排序算法,如冒泡排序、快速排序等。

// Context
public class Context {
    private Strategy strategy;

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

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

// Strategy
public interface Strategy {
    void sort();
}

// ConcreteStrategyA
public class ConcreteStrategyA implements Strategy {
    public void sort() {
        // 冒泡排序
    }
}

// ConcreteStrategyB
public class ConcreteStrategyB implements Strategy {
    public void sort() {
        // 快速排序
    }
}

扩展阅读

更多设计模式的相关内容,请访问设计模式教程

Strategy Pattern Diagram