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

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

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


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


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


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


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


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


二.策略模式实现


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


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


相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
2天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
1天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深度解析
在PHP开发中,策略模式是一种行为设计模式,它允许你在运行时根据不同情况选择不同的算法或行为。本文将深入探讨策略模式的定义、结构、使用场景以及在PHP中的实现方法,并通过实例展示如何在PHP项目中应用策略模式来提高代码的灵活性和可维护性。
|
2天前
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
12 3
|
6天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深度解析
在本文中,我们将深入探讨PHP编程中的策略模式,这是一种行为型设计模式,用于定义一系列算法,将每个算法封装起来,并使它们可以互换。通过详细讲解策略模式的概念、结构以及在PHP中的实现方式,我们希望能够帮助读者更好地理解和应用这一设计模式,提升代码的灵活性和可维护性。
16 1
|
21天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
37 2
|
3天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的应用与实践
在软件开发中,设计模式是解决问题的最佳实践。本文将探讨PHP中的策略模式,通过实际应用案例,展示如何有效地使用策略模式来提高代码的灵活性和可维护性。我们将从基本概念入手,逐步深入到实际编码,最终实现一个具有策略模式的应用。
|
6天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式