策略模式

时间:2024-07-07 06:59:55

策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。

适用场景

  • 当你想使用对象中各种不同的算法变体,并希望能在运行时切换它们时。
  • 当你有许多相似的类,它们的区别仅在于它们的行为时。
  • 当算法使用的数据从外部传入时,策略模式可以避免使用多重条件语句。

结构

  1. 策略接口(Strategy):定义所有支持的算法或操作的接口。
  2. 具体策略(Concrete Strategy):实现策略接口的类。
  3. 上下文(Context):使用策略对象的类,它可以根据需要切换策略。

优点

  • 灵活性和可扩展性:可以轻松地添加新算法或修改现有算法。
  • 消除条件语句:通过组合而非继承来扩展行为,减少条件语句的使用。
  • 遵循开闭原则:无需修改使用算法的类就能引入新的策略。

缺点

  • 客户必须了解不同的策略:客户需要了解所有策略并选择合适的策略。
  • 可能导致许多策略类:每种算法都需要一个策略类,可能导致类的数量增加。

实际应用

  • 排序算法:例如,在数据处理中,可以定义不同的排序策略(冒泡排序、快速排序等)。
  • 支付方式:在电子商务应用中,可以定义不同的支付策略(信用卡、PayPal、支付宝等)。
  • 折扣策略:在零售应用中,可以定义不同的折扣策略(节日折扣、会员折扣等)。

代码示例

以下是一个简单的策略模式示例,使用不同的排序算法对数组进行排序。

// 策略接口
interface SortStrategy {
    void sort(int[] array);
}

// 具体策略 - 冒泡排序
class BubbleSortStrategy implements SortStrategy {
    public void sort(int[] array) {
        // 冒泡排序实现
    }
}

// 具体策略 - 快速排序
class QuickSortStrategy implements SortStrategy {
    public void sort(int[] array) {
        // 快速排序实现
    }
}

// 上下文
class Sorter {
    private SortStrategy sortStrategy;

    public void setSortStrategy(SortStrategy sortStrategy) {
        this.sortStrategy = sortStrategy;
    }

    public void sortArray(int[] array) {
        sortStrategy.sort(array);
    }
}

// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Sorter sorter = new Sorter();
        int[] array = {5, 2, 9, 1, 5, 6};

        // 使用冒泡排序策略
        sorter.setSortStrategy(new BubbleSortStrategy());
        sorter.sortArray(array);

        // 使用快速排序策略
        sorter.setSortStrategy(new QuickSortStrategy());
        sorter.sortArray(array);
    }
}

在这个示例中,Sorter 类是一个上下文,它根据设置的策略对数组进行排序。通过改变策略,可以轻松地切换排序算法。