策略模式
策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
适用场景
- 当你想使用对象中各种不同的算法变体,并希望能在运行时切换它们时。
- 当你有许多相似的类,它们的区别仅在于它们的行为时。
- 当算法使用的数据从外部传入时,策略模式可以避免使用多重条件语句。
结构
- 策略接口(Strategy):定义所有支持的算法或操作的接口。
- 具体策略(Concrete Strategy):实现策略接口的类。
- 上下文(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
类是一个上下文,它根据设置的策略对数组进行排序。通过改变策略,可以轻松地切换排序算法。