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日

相关文章

  • Perl 语法 – 高级特性

    Perl 语法-高级特性的完整攻略 Perl是一种高级编程语言,具有强大的文本处理能力和灵活的语法。本文将详细讲解Perl语法的高级特性,包括正则表达式、闭包、多线程和示例说明。 正则表达式 正则表达式是Perl语言的一个重要特性,可以用来匹配和处理文本。Perl语言中的正则表达式支持多种模式匹配和替换操作,包括字符类、量词、分组和反向引用等。 以下是一个示…

    other 2023年5月5日
    00
  • MySQL因配置过大内存导致无法启动的解决方法

    下面是详细讲解 MySQL 因配置过大内存导致无法启动的解决方法的完整攻略。 1. 问题描述 在配置 MySQL 数据库的时候,如果设置了超过服务器可用内存的内存使用量,可能导致 MySQL 无法启动。这时候可以通过修改 MySQL 配置文件解决。 2. 解决方法 要解决 MySQL 因配置过大内存导致无法启动的问题,需要执行以下步骤: 步骤 1:找到 My…

    other 2023年6月27日
    00
  • 电脑老是重启怎么办?电脑重启的不同原因和对应的解决方法

    电脑老是重启怎么办? 当电脑出现频繁重启的情况时,我们首先需要了解重启的原因,然后才能进行解决。以下是可能的原因和对应的解决方法。 原因一:硬件问题 硬件问题是重启的主要原因之一。例如,电源、内存、硬盘等都可能导致电脑重启。解决方法有: 检查电脑内部连接线是否插牢,尤其是电源线和数据线。 检查电源是否过热,或者电源供电不足,建议更换电源。 检查内存是否正常、…

    other 2023年6月26日
    00
  • 什么是oss/bss(电信业务)

    什么是OSS/BSS(电信业务) 什么是OSS/BSS OSS(Operation Support System,运营支撑系统)和BSS(Business Support System,业务支撑系统)是指电信运营商用于管理其业务流程的两个系统。OSS和BSS都是由一系列的应用程序组成,为运营商提供了管理、监视和支持各种业务流程的工具。 OSS系统关注技术支持…

    其他 2023年3月29日
    00
  • 微信小程序新手入门之自定义组件的使用

    微信小程序的自定义组件能够大幅提升我们的开发效率,同时也使得代码更具复用性。 一、创建自定义组件要创建一个自定义组件,首先需要在小程序项目的根目录下的components文件夹内创建一个子文件夹,命名为自定义组件的名称,如my-component。然后在该文件夹内创建两个文件:my-component.wxml和my-component.js。 my-com…

    other 2023年6月25日
    00
  • driverbooster更新失败

    以下是“Driver Booster更新失败”的完整攻略: Driver Booster更新失败 Driver Booster是一款常用的驱动更新工具,但有时候更新会失败。本攻略将介绍如何解决Driver更新失败的问题,并提供两个示例。 步骤1:检查网络连接 在更新Driver Booster之前,您需要确保您的计算已连接到互联网。请检查您的网络连接是否正常…

    other 2023年5月7日
    00
  • Spring Boot静态资源路径的配置与修改详解

    下面是Spring Boot静态资源路径的配置与修改详解。 为什么需要配置静态资源路径 在一个Web应用中,一般都包含了静态资源,如图片、CSS、JavaScript等。这些静态资源的访问路径是相对固定的,因此需要配置静态资源路径,让Spring Boot在处理静态资源时能够正确地找到它们。 Spring Boot默认的静态资源路径 Spring Boot默…

    other 2023年6月25日
    00
  • osgearth介绍

    osgEarth 介绍 osgEarth是一个开源的地理空间引擎,它使用OpenSceneGraph的各种功能来创建三维地球和地理空间数据的视觉化。osgEarth支持使用各种格式的数据(包括地形高度、矢量地图、遥感影像和OBS代码),可以从不同的数据源中获取数据,并可以快速可视化地展示它们。 osgEarth的设计哲学是通过建立多层次的渲染管道,使地球和地…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部