策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。该模式定义了一系列算法,将每个算法封装到一个独立的类中,并使它们可以互相替换。这样,客户端就可以在不修改原始类的情况下选择不同的算法来解决特定的问题。
结构
策略模式通常包含以下几个角色:
-
策略接口(Strategy Interface):定义了一个算法族的接口,其中包含了一系列具体的算法。通常是一个接口或者抽象类。
-
具体策略(Concrete Strategies):实现了策略接口的具体算法类。每个具体策略类都实现了算法的具体逻辑。
-
上下文(Context):维护一个对策略对象的引用,并且可以在运行时切换不同的策略。
示例
让我们以一个排序算法的示例来说明策略模式:
// 策略接口
interface SortingStrategy {
void sort(int[] array);
}
// 具体策略类:冒泡排序
class BubbleSort implements SortingStrategy {
public void sort(int[] array) {
// 冒泡排序算法的具体实现
}
}
// 具体策略类:快速排序
class QuickSort implements SortingStrategy {
public void sort(int[] array) {
// 快速排序算法的具体实现
}
}
// 上下文类
class Context {
private SortingStrategy strategy;
public Context(SortingStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(SortingStrategy strategy) {
this.strategy = strategy;
}
public void executeStrategy(int[] array) {
strategy.sort(array);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
int[] array = {3, 1, 4, 1, 5, 9, 2, 6};
Context context = new Context(new BubbleSort());
context.executeStrategy(array); // 使用冒泡排序
context.setStrategy(new QuickSort());
context.executeStrategy(array); // 使用快速排序
}
}
在这个示例中,我们定义了一个排序策略接口 SortingStrategy
,并实现了两种具体的排序算法:冒泡排序和快速排序。然后,我们使用一个上下文类 Context
来维护对策略对象的引用,并且在运行时可以切换不同的策略。最后,我们在客户端代码中创建了一个上下文对象,并且根据需要选择不同的排序策略来对数组进行排序。
策略模式的优点包括:灵活性高、可扩展性强、代码复用性好。它可以让算法独立于客户端而变化,并且方便地进行单元测试。