一.策略模式介绍与使用场景
-
多种算法或行为选择:当有多个相关的算法或行为可供选择,并且需要在运行时动态选择其中之一时,策略模式非常适用。它允许根据需求选择适当的策略,而不需要更改客户端代码。
-
消除条件语句:当存在大量的条件语句来根据不同情况执行不同的行为时,使用策略模式可以消除这些冗长的条件语句。每个条件对应一个具体的策略,客户端只需选择正确的策略即可。
-
算法的独立性:策略模式将算法封装在各自的策略类中,使得每个算法可以独立于其他算法进行修改和演化。这样可以保持代码的灵活性和可维护性。
-
扩展性:通过定义新的策略类,可以方便地添加新的算法或行为,而不需要修改现有的代码。这使得系统更易于扩展和维护。
-
避免继承的复杂性:策略模式提供了一种替代继承的方式,使得不同的行为可以通过组合而不是继承来实现。这样可以避免类之间的紧耦合关系和继承层次结构的复杂性。
二.策略模式实现
策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。该模式通过将算法封装在独立的策略类中,使得它们可以互相替换,而不影响客户端代码。
例如下面例子用策略模式实现不同的算法实现:
// 定义排序策略接口
interface SortingStrategy {
void sort(int[] array);
}
// 实现具体的排序策略类
class BubbleSortStrategy implements SortingStrategy {
public void sort(int[] array) {
System.out.println("Sorting array using Bubble Sort.");
// 实现具体的冒泡排序算法
}
}
class QuickSortStrategy implements SortingStrategy {
public void sort(int[] array) {
System.out.println("Sorting array using Quick Sort.");
// 实现具体的快速排序算法
}
}
// 定义客户端类,使用策略进行排序
class SortClient {
private SortingStrategy sortingStrategy;
public void setSortingStrategy(SortingStrategy sortingStrategy) {
this.sortingStrategy = sortingStrategy;
}
public void performSort(int[] array) {
sortingStrategy.sort(array);
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
SortClient client = new SortClient();
// 使用冒泡排序策略
SortingStrategy bubbleSortStrategy = new BubbleSortStrategy();
client.setSortingStrategy(bubbleSortStrategy);
int[] array = {5, 2, 8, 1, 9};
client.performSort(array);
// 使用快速排序策略
SortingStrategy quickSortStrategy = new QuickSortStrategy();
client.setSortingStrategy(quickSortStrategy);
int[] anotherArray = {10, 7, 3, 6, 4};
client.performSort(anotherArray);
}
}
我们定义了一个SortingStrategy
接口,它包含一个sort
方法用于对整数数组进行排序。然后,我们实现了两种具体的排序策略:BubbleSortStrategy
和QuickSortStrategy
,它们分别实现了冒泡排序和快速排序算法。
接下来,我们定义了一个SortClient
类,它包含一个setSortingStrategy
方法用于设置排序策略,并且有一个performSort
方法用于执行排序操作。通过在客户端代码中设置不同的排序策略,我们可以选择使用不同的算法对数组进行排序。
在Main
类的main
方法中,我们演示了如何使用策略模式进行排序。首先,我们创建一个SortClient
对象,并使用冒泡排序策略对一个数组进行排序。然后,我们切换到快速排序策略并对另一个数组进行排序。
这样,使用策略模式,我们可以轻松地切换和组合不同的算法,而不必更改客户端代码。
在项目开发中,还有很多适用的应用场景,例如某公司需要举办不同的电商活动,根据情况选择不同的活动算法,用策略模式实现如下:
// 定义策略接口
interface DiscountStrategy {
double applyDiscount(double amount);
}
// 实现具体的策略类
class ChristmasDiscountStrategy implements DiscountStrategy {
public double applyDiscount(double amount) {
System.out.println("Applying Christmas discount.");
return amount * 0.8; // 打八折
}
}
class BlackFridayDiscountStrategy implements DiscountStrategy {
public double applyDiscount(double amount) {
System.out.println("Applying Black Friday discount.");
return amount * 0.7; // 打七折
}
}
// 定义客户端类,使用策略进行折扣计算
class ShoppingCart {
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double calculateTotalAmount(double amount) {
double discountedAmount = discountStrategy.applyDiscount(amount);
// 其他计算逻辑...
return discountedAmount;
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 使用圣诞折扣策略
DiscountStrategy christmasDiscount = new ChristmasDiscountStrategy();
cart.setDiscountStrategy(christmasDiscount);
double amount = 100.0;
double totalAmount = cart.calculateTotalAmount(amount);
System.out.println("Total amount after discount: " + totalAmount);
// 使用黑色星期五折扣策略
DiscountStrategy blackFridayDiscount = new BlackFridayDiscountStrategy();
cart.setDiscountStrategy(blackFridayDiscount);
amount = 200.0;
totalAmount = cart.calculateTotalAmount(amount);
System.out.println("Total amount after discount: " + totalAmount);
}
}
在上述示例中,我们定义了一个 DiscountStrategy
接口,它包含一个 applyDiscount
方法用于计算折扣后的金额。然后,我们实现了两种具体的折扣策略类:ChristmasDiscountStrategy
(圣诞折扣策略)和 BlackFridayDiscountStrategy
(黑色星期五折扣策略),它们分别根据不同的活动规则来计算折扣后的金额。
接下来,我们定义了一个 ShoppingCart
类,它包含一个 setDiscountStrategy
方法用于设置折扣策略,并且有一个 calculateTotalAmount
方法用于计算折扣后的总金额。通过在客户端代码中设置不同的折扣策略,我们可以选择应用不同的活动折扣。
在 Main
类的 main
方法中,我们演示了如何使用策略模式进行电商活动的折扣计算。首先,我们创建一个 ShoppingCart
对象,并使用圣诞折扣策略计算购物车中商品的总金额。然后,我们切换到黑色星期五折扣策略并重新计算总金额。
这样,使用策略模式,我们可以轻松地切换和组合不同的活动折扣策略。