设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化。
策略模式的概念
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换。这种模式让算法的变化独立于使用算法的客户。在策略模式中,算法的变化是通过使用组合而不是继承来实现的。这种方式提高了算法替换的灵活性和复用性。
策略模式的优点
- 提高了算法的复用性:策略模式通过定义算法族,使得每个算法可以独立于客户端进行复用。
- 扩展性良好:添加一个新的策略或者算法不会影响到已有的策略和客户端。
- 消除了大量的条件语句:策略模式提供了管理相关的算法族的方法,避免了使用多重条件转移语句。
- 可以提供相同行为的不同实现:根据不同的情况,可以更换不同的策略来达到预期的行为。
策略模式的缺点
- 客户端必须知道所有的策略类:这是因为客户端需要决定使用哪一个策略类。
- 增加了对象的数目:每一个策略都是一个类,每次使用策略都需要实例化。
Java代码示例
下面是一个简单的策略模式实现,定义了一个排序策略接口和两种具体的排序策略(冒泡排序和快速排序),以及一个使用这些策略的客户端类。
java复制代码
// 策略接口
public interface SortingStrategy {
void sort(int[] array);
}
// 具体策略类:冒泡排序
public class BubbleSortStrategy implements SortingStrategy {
@Override
public void sort(int[] array) {
// 冒泡排序算法实现
System.out.println("Sorting array using bubble sort strategy");
}
}
// 具体策略类:快速排序
public class QuickSortStrategy implements SortingStrategy {
@Override
public void sort(int[] array) {
// 快速排序算法实现
System.out.println("Sorting array using quick sort strategy");
}
}
// 客户端使用策略
public class Sorter {
private SortingStrategy strategy;
public Sorter(SortingStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(SortingStrategy strategy) {
this.strategy = strategy;
}
public void sortArray(int[] array) {
strategy.sort(array);
}
}
// 使用示例
public class StrategyPatternDemo {
public static void main(String[] args) {
int[] array = {1, 3, 2, 5, 4};
Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sortArray(array); // 使用冒泡排序
sorter.setStrategy(new QuickSortStrategy());
sorter.sortArray(array); // 使用快速排序
}
}
在这个例子中,SortingStrategy
是一个策略接口,BubbleSortStrategy
和 QuickSortStrategy
是具体的策略实现。Sorter
类使用一个 SortingStrategy
来对数组进行排序。这个设计允许在运行时切换排序算法,提高了代码的灵活性和可维护性。