【设计模式】用Java实现策略模式

一.策略模式介绍与使用场景

  1. 多种算法或行为选择当有多个相关的算法或行为可供选择,并且需要在运行时动态选择其中之一时,策略模式非常适用。它允许根据需求选择适当的策略,而不需要更改客户端代码。

  2. 消除条件语句:当存在大量的条件语句来根据不同情况执行不同的行为时,使用策略模式可以消除这些冗长的条件语句。每个条件对应一个具体的策略,客户端只需选择正确的策略即可。

  3. 算法的独立性策略模式将算法封装在各自的策略类中,使得每个算法可以独立于其他算法进行修改和演化。这样可以保持代码的灵活性和可维护性

  4. 扩展性:通过定义新的策略类,可以方便地添加新的算法或行为,而不需要修改现有的代码。这使得系统更易于扩展和维护

  5. 避免继承的复杂性:策略模式提供了一种替代继承的方式,使得不同的行为可以通过组合而不是继承来实现。这样可以避免类之间的紧耦合关系和继承层次结构的复杂性

二.策略模式实现

策略模式(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方法用于对整数数组进行排序。然后,我们实现了两种具体的排序策略:BubbleSortStrategyQuickSortStrategy,它们分别实现了冒泡排序和快速排序算法。

接下来,我们定义了一个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 对象,并使用圣诞折扣策略计算购物车中商品的总金额。然后,我们切换到黑色星期五折扣策略并重新计算总金额。

这样,使用策略模式,我们可以轻松地切换和组合不同的活动折扣策略。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java代码实现策略模式可以通过创建一个抽象策略类来实现,此类中封装了具体实现策略的抽象方法,然后具体策略类去继承抽象策略类,并实现具体的策略方法。最后,客户端可以根据需要,动态地实例化不同的具体策略类,并调用它们的策略方法。 ### 回答2: 策略模式是一种行为设计模式,它允许我们将不同的算法封装成独立的类,并且使得它们可以相互之间替换。在Java中,我们可以通过接口和多态性来实现策略模式。 首先,我们需要定义一个策略接口,用于声明所有具体策略类所需实现的方法。例如,我们定义一个排序策略接口`SortStrategy`,其中包含一个`sort`方法用于实现具体的排序算法。 ```java public interface SortStrategy { void sort(int[] numbers); } ``` 接下来,我们可以实现不同的具体策略类,每个类都实现了`SortStrategy`接口,并根据不同的算法实现了`sort`方法。例如,我们实现了冒泡排序算法`BubbleSort`和快速排序算法`QuickSort`。 ```java public class BubbleSort implements SortStrategy { @Override public void sort(int[] numbers) { // 冒泡排序算法的具体实现 } } public class QuickSort implements SortStrategy { @Override public void sort(int[] numbers) { // 快速排序算法的具体实现 } } ``` 最后,我们可以使用策略模式来进行排序。在客户端代码中,我们使用一个保存了具体策略对象的变量,并调用策略对象的方法来进行排序。 ```java public class SortClient { private SortStrategy sortStrategy; public SortClient(SortStrategy sortStrategy) { this.sortStrategy = sortStrategy; } public void sortNumbers(int[] numbers) { sortStrategy.sort(numbers); } } ``` 使用策略模式时,我们可以动态地改变具体策略对象,从而实现不同的算法。例如: ```java SortClient client = new SortClient(new BubbleSort()); client.sortNumbers(numbers); // 使用冒泡排序算法进行排序 // 动态改变策略对象 client.setSortStrategy(new QuickSort()); client.sortNumbers(numbers); // 使用快速排序算法进行排序 ``` 通过使用策略模式,我们可以将排序算法的具体实现与客户端代码解耦,使得客户端可以方便地切换算法或者增加新的算法实现。这样,我们可以提高代码的复用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值