策略模式

cccs7 Lv5

在策略模式(Strategy Pattern)中,一个类 的 行为 或其 算法 可以在的 运行时更改。这种 类型的 设计模式属于 行为型模式。 我们创建表示 各种策略模式的对象和一个行为 随着对象而改变的 context 对象。策略对象 改变 context 对象的执行算法

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以互换。在策略模式中,算法的变化独立于使用它们的客户端。客户端可以根据需要选择不同的算法,而不必关心算法的具体实现。在 Java 中,策略模式通常使用接口来定义算法,而具体的算法实现则由实现接口的类来提供。

意图: 定义一系列的算法,把他们一个一个封装起来,并且使他们可互相替换

**主要解决: ** 在有多种算法相似的情况下,使用 if - else 所带来的复杂和难以维护

**何时使用: ** 一个系统有许多个类,而区分他们的只是他们直接的行为

**如何解决: **将这些算法封装成一个个类,任意地替换

**关键代码: **实现同一个接口

**使用场景: **

  1. 如果一个系统里面有许多的类,他们之间的区别仅在于他们的行为,那么使用策略模式 动态地让一个对象在许多行为中选择一种行为
  2. 一个系统需要动态地在 几种算法中选择一种
  3. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

**注意事项: ** 如果一个系统的策略多于 4 个,就需要考虑使用 混合模式,解决策略类膨胀的问题

当一个系统的策略类超过4个时,可以考虑使用混合模式来解决策略类膨胀的问题。混合模式是指在策略模式的基础上,结合其他设计模式来实现更灵活和可扩展的解决方案。混合模式可以结合以下设计模式来解决策略类膨胀的问题:

  1. 工厂模式:使用工厂模式来创建策略对象,将策略对象的创建逻辑封装在工厂类中。这样可以避免在客户端代码中直接实例化大量的策略类对象,减少了类的膨胀。
  2. 组合模式:使用组合模式将多个策略对象组合成一个更复杂的策略。通过将多个策略对象组合起来,可以实现更复杂的业务逻辑,并且可以动态地添加、删除或替换策略对象。
  3. 状态模式:使用状态模式来管理策略的状态。每个状态对应一个具体的策略,通过状态模式可以在运行时动态地切换策略,而不需要修改客户端代码。
  4. 委托模式:使用委托模式将策略的选择和执行委托给一个中间对象。中间对象负责根据条件选择合适的策略,并将执行委托给选定的策略对象。这样可以减少策略类的数量,并且可以动态地改变策略的选择。

**示例: **

假设我们要实现一个排序算法,可以根据不同的需求选择不同的排序算法。我们可以使用策略模式来实现这个功能。首先,我们定义一个排序算法的接口 SortAlgorithm,其中包含一个 sort 方法,用于对数组进行排序。

1
2
3
public interface SortAlgorithm {
void sort(int[] arr);
}

然后,我们定义两个具体的排序算法类 BubbleSortQuickSort,分别表示冒泡排序和快速排序。这两个类需要实现 SortAlgorithm 接口,来提供具体的排序实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class BubbleSort implements SortAlgorithm {
@Override
public void sort(int[] arr) {
// 冒泡排序实现
}
}

public class QuickSort implements SortAlgorithm {
@Override
public void sort(int[] arr) {
// 快速排序实现
}
}

最后,我们定义一个排序类 Sorter,其中包含一个 sort 方法,用于对数组进行排序。这个 sort 方法接收一个 SortAlgorithm 对象作为参数,用于指定具体的排序算法。

1
2
3
4
5
public class Sorter {
public void sort(int[] arr, SortAlgorithm algorithm) {
algorithm.sort(arr);
}
}

在这个例子中,我们使用了策略模式来实现排序算法的选择。客户端可以根据需要选择不同的排序算法,而不必关心算法的具体实现。以下是一个测试类,用于测试这个排序算法:

1
2
3
4
5
6
7
8
9
10
11
12
public class SortTest {
public static void main(String[] args) {
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
Sorter sorter = new Sorter();

// 使用冒泡排序
sorter.sort(arr, new BubbleSort());

// 使用快速排序
sorter.sort(arr, new QuickSort());
}
}

在这个测试类中,我们创建了一个 Sorter 对象,并使用不同的排序算法来对数组进行排序。由于算法的变化独立于使用它们的客户端,因此客户端可以根据需要选择不同的排序算法。这个例子展示了策略模式的应用,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以互换。

  • Title: 策略模式
  • Author: cccs7
  • Created at: 2023-08-05 23:13:22
  • Updated at: 2023-08-05 23:32:24
  • Link: https://blog.cccs7.icu/2023/08/05/策略模式/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
策略模式