策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态改变一个对象的行为。该模式定义了一系列算法,并将每个算法封装起来,使它们可以互换使用,而不会影响到客户端。
应用场景:
-
当一个对象有多个行为,并且需要动态切换行为时,可以使用策略模式。例如,一个电商网站可能需要支持多种付款方式,比如支付宝、微信、银联等。我们可以定义一个 PaymentStrategy 接口,并为每种付款方式实现一个具体的策略类,然后在运行时动态地切换不同的策略。
-
当一组算法中的每个算法都具有不同的变体时,可以使用策略模式。例如,一个排序算法可能具有多种不同的实现,比如快速排序、归并排序、冒泡排序等。我们可以定义一个 SortStrategy 接口,并为每个算法实现一个具体的策略类,然后在运行时动态地选择不同的算法实现。
原理: 策略模式定义了一组算法接口,同时定义了多个具体的算法实现。客户端可以根据具体的需求选择不同的算法实现。为了使算法可以互换使用,策略模式要求所有算法实现都实现同一个接口,并且具有相同的方法签名。
在策略模式中,客户端通过上下文对象来选择不同的算法实现。上下文对象将具体的算法实现封装起来,并将算法的选择委托给客户端。这样,客户端就可以在运行时动态地选择不同的算法实现。
Java实例: 首先,我们定义一个接口,它将定义我们的算法行为:
public interface SortAlgorithm {
public int[] sort(int[] numbers);
}
然后,我们可以实现该接口来定义不同的排序算法:
public class BubbleSortAlgorithm implements SortAlgorithm {
public int[] sort(int[] numbers) {
// implementation of bubble sort algorithm
return numbers;
}
}
public class QuickSortAlgorithm implements SortAlgorithm {
public int[] sort(int[] numbers) {
// implementation of quick sort algorithm
return numbers;
}
}
public class MergeSortAlgorithm implements SortAlgorithm {
public int[] sort(int[] numbers) {
// implementation of merge sort algorithm
return numbers;
}
}
接下来,我们定义一个策略上下文类,它将使用接口来保存和执行算法:
public class SortStrategy {
private SortAlgorithm algorithm;
public SortStrategy(SortAlgorithm algorithm) {
this.algorithm = algorithm;
}
public int[] executeStrategy(int[] numbers) {
return algorithm.sort(numbers);
}
}
现在我们可以在我们的客户端代码中使用策略模式来选择不同的排序算法:
int[] numbers = {5, 1, 4, 2, 8};
SortStrategy strategy;
// Sort using bubble sort
strategy = new SortStrategy(new BubbleSortAlgorithm());
int[] sortedNumbers = strategy.executeStrategy(numbers);
// Sort using quick sort
strategy = new SortStrategy(new QuickSortAlgorithm());
sortedNumbers = strategy.executeStrategy(numbers);
// Sort using merge sort
strategy = new SortStrategy(new MergeSortAlgorithm());
sortedNumbers = strategy.executeStrategy(numbers);
这样,我们就可以在运行时选择使用不同的算法来排序数字,而不需要在代码中硬编码算法