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


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


相关文章
|
9天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
30 2
|
21天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
35 0
[Java]23种设计模式
|
4天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
30天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
30 3
|
30天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
28 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
61 3
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
28 1
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
22 2
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
在PHP开发中,设计模式是提高代码可读性、可维护性和扩展性的重要工具。本文将深入探讨策略模式这一行为型设计模式,通过分析其定义、结构、使用场景以及在PHP中的实际应用,帮助开发者更好地理解和运用策略模式来优化自己的项目。不同于传统摘要的简洁概述,本文摘要部分将详细阐述策略模式的核心理念和在PHP中的实现方法,为读者提供清晰的指引。

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75