Java设计模式之策略模式深入刨析

Java设计模式之策略模式深入刨析

策略模式是什么?

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。

通常情况下,策略模式适用于有多种算法或策略可供选择的场景,程序需要动态选择一种算法或策略的情况下。

什么情况下使用策略模式?

当需要动态选择算法或策略的时候,可以使用策略模式。

比如,在一个在线电商网站中,用户在购物时可以选择不同的支付方式。这些支付方式包括信用卡支付、支付宝支付、微信支付等。在选择支付方式时,我们可以动态选择一种支付策略,以提供更加灵活的支付选择。

策略模式的几个角色

策略模式中通常包含以下几个角色:

  1. Context(上下文): 上下文是客户端代码访问的对象,它提供了一些访问策略的接口。

  2. Strategy(策略): 它定义了一系列的算法或策略,并且抽象了这些算法或策略的公共部分,将具体的算法或策略细节延迟到子类中实现。

  3. ConcreteStrategy(具体策略): 具体策略是策略模式的具体实现,它实现了策略接口中定义的算法或策略,并且负责接收和处理Context传递的数据。

以下是其中一个使用策略模式的示例:

示例一:电商支付系统

在该示例中,我们将实现一个简单的电商支付系统。该系统支持信用卡支付、支付宝支付和微信支付等不同的支付方式。

首先我们需要定义一个支付策略接口:

/**
 * 支付策略接口
 */
public interface PaymentStrategy {
    void pay(double amount);
}

然后,我们需要定义具体的支付策略类,分别对应不同的支付方式:

/**
 * 信用卡支付策略
 */
public class CreditCardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用信用卡支付 " + amount + " 元");
    }
}

/**
 * 支付宝支付策略
 */
public class AlipayPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付 " + amount + " 元");
    }
}

/**
 * 微信支付策略
 */
public class WechatPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付 " + amount + " 元");
    }
}

最后,我们定义一个上下文类PaymentContext,该类负责接收Request请求,并根据用户选择的不同支付方式来选择相应的具体策略进行支付:

/**
 * 上下文类
 */
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    /**
     * 根据用户选择的支付方式设置具体策略
     */
    public void setPaymentStrategy(String paymentType) {
        if ("creditCard".equals(paymentType)) {
            paymentStrategy = new CreditCardPaymentStrategy();
        } else if ("alipay".equals(paymentType)) {
            paymentStrategy = new AlipayPaymentStrategy();
        } else if ("wechat".equals(paymentType)) {
            paymentStrategy = new WechatPaymentStrategy();
        }
    }

    /**
     * 调用具体策略进行支付
     */
    public void pay(double amount) {
        paymentStrategy.pay(amount);
    }
}

客户端代码可以使用如下方式来实现支付操作:

public static void main(String[] args) {
    // 创建上下文
    PaymentContext context = new PaymentContext();

    // 设置支付方式为信用卡
    context.setPaymentStrategy("creditCard");

    // 调用支付操作
    context.pay(100);

    // 更换支付方式为支付宝
    context.setPaymentStrategy("alipay");
    context.pay(200);

    // 更换支付方式为微信
    context.setPaymentStrategy("wechat");
    context.pay(300);
}

在上述示例中,我们实现了一个简单的电商支付系统。在该系统实现中,我们使用了策略模式,根据不同的用户选择,选择不同的具体策略进行支付。

示例二:排序算法

在该示例中,我们将展示策略模式在排序算法中的应用。在该示例中,我们实现了不同的排序算法,将其封装成具体的策略,并根据用户选择的不同排序算法,动态选择具体的策略进行排序。

首先我们定义一个排序策略接口:

/**
 * 排序策略接口
 */
public interface SortStrategy {
    void sort(int[] data);
}

然后,我们需要定义具体的排序策略类,分别对应不同的排序算法:

/**
 * 冒泡排序策略
 */
public class BubbleSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        System.out.println("使用冒泡排序算法进行排序");
        // 冒泡排序算法实现
    }
}

/**
 * 快速排序策略
 */
public class QuickSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        System.out.println("使用快速排序算法进行排序");
        // 快速排序算法实现
    }
}

/**
 * 插入排序策略
 */
public class InsertionSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        System.out.println("使用插入排序算法进行排序");
        // 插入排序算法实现
    }
}

最后,我们定义一个上下文类SortContext,该类负责接收要排序的数据,并根据选择的排序算法来选择对应的具体策略进行排序,示例代码如下:

/**
 * 上下文类
 */
public class SortContext {
    private SortStrategy sortStrategy;

    /**
     * 根据用户选择的排序算法设置具体策略
     */
    public void setSortStrategy(String sortType) {
        if ("bubble".equals(sortType)) {
            sortStrategy = new BubbleSortStrategy();
        } else if ("quick".equals(sortType)) {
            sortStrategy = new QuickSortStrategy();
        } else if ("insertion".equals(sortType)) {
            sortStrategy = new InsertionSortStrategy();
        }
    }

    /**
     * 调用具体策略进行排序
     */
    public void sort(int[] data) {
        sortStrategy.sort(data);
    }
}

客户端代码可以使用如下方式来实现排序操作:

public static void main(String[] args) {
    // 创建上下文
    SortContext context = new SortContext();

    // 设置排序算法为冒泡排序
    context.setSortStrategy("bubble");

    // 调用排序操作
    int[] data1 = {5, 3, 2, 4, 1};
    context.sort(data1);

    // 更换排序算法为快速排序
    context.setSortStrategy("quick");
    int[] data2 = {5, 3, 2, 4, 1};
    context.sort(data2);

    // 更换排序算法为插入排序
    context.setSortStrategy("insertion");
    int[] data3 = {5, 3, 2, 4, 1};
    context.sort(data3);
}

在上述示例中,我们实现了不同的排序算法,将其封装成具体的策略,并根据用户选择的不同排序算法,动态选择具体的策略进行排序。在该示例中,我们通过策略模式实现了不同排序算法的可插拔性,并且实现了更加灵活的排序算法选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之策略模式深入刨析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 【mysql】计算tps qps的方式

    【mysql】计算tps qps的方式 在数据库中,TPS (Transaction Per Second) 指的是每秒钟系统能够处理的事务数,是衡量系统处理能力的重要指标之一。而 QPS (Queries Per Second) 则是每秒处理的查询数量。本文将介绍如何通过 mysql 自带的工具计算出 tps 和 qps。 计算 TPS 在 mysql 中…

    其他 2023年3月28日
    00
  • Python获取指定文件夹下的文件名的方法

    获取指定文件夹下的文件名,我们可以使用Python中的os模块来实现。具体步骤如下: 1. 导入os模块 import os 2. 定义文件夹路径 folder_path = ‘/path/to/folder’ 要获取指定文件夹下的文件名,首先需要定义文件夹路径。其中,/path/to/folder应根据实际情况进行替换。 3. 使用os.listdir()…

    other 2023年6月26日
    00
  • Android控件之EditView常用属性及应用方法

    Android控件之EditView常用属性及应用方法 EditView是Android中的一个常用控件,用于输入文本信息。在使用EditView时,常用的属性及应用方法有以下几点: 常用属性 android:id android:id用于给EditView设置唯一标识符,方便后续在Java代码中对该控件进行操作。 示例: <EditText andr…

    other 2023年6月27日
    00
  • confluence7.4安装并破解汉化教程

    简介 Confluence是一款企业级的团队协作软件,可以帮助团队协作、共享知识和管理文档。在本攻略中,将介绍如何安装、破解和汉化Confluence 7.4提供两个示例说明。 步骤 以下是安装、解和汉化Confluence 7.4的步骤。 步骤1:下载fluence 7.4 首先,我们需要下载Confluence 74的安装包。我们可以按照以下步骤进行操作…

    other 2023年5月6日
    00
  • 程序员 代码是从头编还是使用框架好呢?

    当程序员开始编写代码时,他们经常会面临一个选择:是从头开始编写代码,还是使用框架来加速开发和减少代码的编写时间。虽然这个选择可能因项目而异,但以下是一些攻略来帮助你做出正确的决定: 什么是框架? 在了解如何选择到底是使用框架还是手写代码之前,需要了解什么是框架。框架通常是一组预定的规则、标准和工具的集合,可用于快速开发应用程序。框架也允许多个程序员在同一应用…

    other 2023年6月26日
    00
  • Linux系统下安装.bundle后缀程序的教程

    Linux系统下安装.bundle后缀程序的教程 有些软件在Linux系统中以.bundle后缀的形式提供,这些程序通常是二进制文件的集合,需要进行特殊的安装过程。下面是在Linux系统下安装.bundle后缀程序的完整攻略: 下载.bundle文件:首先,你需要从软件的官方网站或其他可信来源下载.bundle文件。通常,这个文件会以压缩包的形式提供,你需要…

    other 2023年8月5日
    00
  • JS 中在严格模式下 this 的指向问题

    JS 中在严格模式下 this 的指向问题 在 JavaScript 中,严格模式(strict mode)是一种更加严格的代码执行模式,它对一些不规范的语法和行为进行了限制。在严格模式下,this 的指向会有一些变化,下面将详细讲解这个问题。 1. 默认情况下的 this 指向 在非严格模式下,默认情况下,this 的指向取决于函数的调用方式。具体规则如下…

    other 2023年8月21日
    00
  • zip格式压缩文件辅助类(ZipHelper)

    概述 ZipHelper是一个zip格式压缩文件辅助类,可以帮助我们更方便地进行zip格式文件的压缩和解压缩。本文将为您提供一份完整攻略,介绍如何使用ZipHelper。 使用ZipHelper进行zip格式文件的压缩和解压缩 步骤1:引入ZipHelper类 在使用ZipHelper之前,需要将ZipHelper类引入到我们的项目中。可以将ZipHelpe…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部