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

yizhihongxing

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日

相关文章

  • MPAndroidChart绘制自定义运动数据图表示例详解

    下面我将为你详细讲解“MPAndroidChart绘制自定义运动数据图表示例详解”的完整攻略。 一、简介 MPAndroidChart是一个开源的Android图表控件库,它支持多种图表类型,包括线形图、柱状图、饼图等。它的功能非常强大,能够实现多种复杂的图表需求。本篇攻略将详细讲解如何使用MPAndroidChart绘制自定义运动数据图。 二、创建新项目 …

    other 2023年6月25日
    00
  • ubuntu主题美化篇

    Ubuntu主题美化篇的完整攻略 Ubuntu是一款流行的Linux操作系统,它提供了许多主题和图标,可以让您自定义桌面外观。以下是Ubuntu主题美化篇的完整攻略,包含两个示例说明。 步骤一:安装主题和图标 打开终端。 您可以使用快捷键“Ctrl + Alt + T”打开终端。 添加PPA。 运行以下命令添加PPA。 sudo add-apt-reposi…

    other 2023年5月9日
    00
  • 手机usb调试在哪里

    USB调试是一种在开发和测试Android应用程序时非常有用的功能。它通过USB连接将Android设备连接到计算机上,并允许开发人员查看设备日志、运行命令行工具以及测试应用程序。 以下是在不同操作系统上使用USB调试的完整攻略: 在Windows上使用USB调试 安装Android SDK 在Windows上使用USB调试需要安装Android SDK。下…

    其他 2023年4月16日
    00
  • Bootstrap每天必学之面板

    Bootstrap每天必学之面板攻略 什么是Bootstrap面板? Bootstrap面板是一种用于创建漂亮的容器和布局的组件。它可以用于显示内容、组织信息和提供用户界面元素。面板通常由标题、内容和可选的页脚组成。 步骤1:引入Bootstrap 首先,确保你已经引入了Bootstrap的CSS和JavaScript文件。你可以从官方网站下载最新版本的Bo…

    other 2023年7月28日
    00
  • less的基本用法

    以下是关于“less的基本用法”的完整攻略,过程中包含两个示例。 背景 less是一种Linux/Unix系统下的分页查看器,它可以用于查看文本文件的内容。与cat命令不同,less可以将文本分页显示,方便用户查看大型文本文件。在Linux/Unix系统中,less是一种常常用的工具。 基本用法 在Linux/Unix系统中,使用less非常简单。具体步骤如…

    other 2023年5月9日
    00
  • Linux内核设备驱动之内核中链表的使用笔记整理

    Linux内核设备驱动之内核中链表的使用笔记整理 1. 简介 在Linux内核中,链表(linked list)是一个常用的数据结构,用于实现不同的数据结构,例如队列、栈、哈希表等。链表的结构相对于数组更加灵活,可以动态地添加和删除元素,但是在访问链表中的元素时需要遍历整个链表,因此访问速度相对较慢。在驱动程序中,链表的使用也很普遍,例如用于管理设备队列、内…

    other 2023年6月27日
    00
  • 深入理解C++编程中的局部变量和全局变量

    深入理解C++编程中的局部变量和全局变量攻略 在C++编程中,局部变量和全局变量是两种不同的变量类型,它们在作用域、生命周期和访问权限等方面有所不同。本攻略将详细介绍这两种变量类型的特点,并提供示例说明。 局部变量 局部变量是在函数内部或代码块内部声明的变量,它们只在其所在的作用域内可见和可访问。局部变量的生命周期仅限于其所在的作用域,当程序执行离开该作用域…

    other 2023年7月28日
    00
  • 自己动手怎么搭建私人服务器?搭建私人服务器的方法

    自己动手怎么搭建私人服务器?搭建私人服务器的方法 概述 搭建私人服务器意味着您有一个能够在互联网上访问的网站。该网站可以用于存储和分享文件、托管应用程序和网站以及提供能够在全球范围内访问的在线服务。在本文中,我们将介绍如何自己动手搭建私人服务器的方法。 步骤 1. 购买域名和主机 首先,您需要购买一个域名和服务器主机才能在互联网上托管自己的网站。域名是您网站…

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