Java 设计模式中的策略模式详情

yizhihongxing

Java 设计模式中的策略模式

策略模式基础概念

策略模式是一种行为型设计模式,它能让你定义一些算法并将其封装到具有公共接口的独立类中。由于所有策略类都实现了相同的接口,因此它们可以自由地相互替换。

策略模式的结构

策略模式的核心在于定义一个策略接口(Istrategy),所有的算法都实现这个接口;然后定义一个上下文类(Context),这个上下文类有一个策略接口类型的成员变量strategy,初始化时或者运行时动态地给这个成员变量赋值,从而使得上下文类可以使用不同的算法。

public interface IStrategy {
    void algorithm();
}

public class ConcreteStrategyA implements IStrategy {
    @Override
    public void algorithm() {
        // 算法A的具体实现
    }
}

public class ConcreteStrategyB implements IStrategy {
    @Override
    public void algorithm() {
        // 算法B的具体实现
    }
}

public class Context {
    private IStrategy strategy;

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void doStrategy() {
        if (strategy != null) {
            strategy.algorithm();
        }
    }
}

策略模式的应用场景

策略模式通常在以下场景中使用:

  • 当你有许多类似的算法,以相同的方式处理数据时,可以使用策略模式。
  • 当你需要在运行时选择算法的不同变体时,可以使用策略模式。
  • 当您想要隐藏算法的实现细节时,可以使用策略模式。

策略模式的示例

示例1:支付方式算法

假设你正在开发一个电商网站,你需要允许用户选择不同的支付方式来支付订单。你可以使用策略模式来实现。

public interface PaymentStrategy {
    void pay(double amount);
}

public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("通过支付宝支付了" + amount + "元");
    }
}

public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("通过微信支付了" + amount + "元");
    }
}

public class Order {
    private PaymentStrategy strategy;

    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void pay(double amount) {
        if (strategy != null) {
            strategy.pay(amount);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        PaymentStrategy strategy = new AlipayStrategy();
        Order order = new Order();
        order.setStrategy(strategy);
        order.pay(100);

        strategy = new WechatPayStrategy();
        order.setStrategy(strategy);
        order.pay(200);
    }
}

示例2:排序算法

假设你正在开发一个工具程序,你需要支持各种排序算法,包括冒泡排序、快速排序、插入排序等。你可以使用策略模式来实现。

public interface SortStrategy {
    void sort(int[] data);
}

public class BubbleSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        // 冒泡排序的具体实现
    }
}

public class QuickSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        // 快速排序的具体实现
    }
}

public class InsertionSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] data) {
        // 插入排序的具体实现
    }
}

public class Sorter {
    private SortStrategy strategy;

    public void setStrategy(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public void sort(int[] data) {
        if (strategy != null) {
            strategy.sort(data);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        SortStrategy strategy = new BubbleSortStrategy();
        Sorter sorter = new Sorter();
        sorter.setStrategy(strategy);
        int[] data = {5, 4, 3, 2, 1};
        sorter.sort(data);

        strategy = new QuickSortStrategy();
        sorter.setStrategy(strategy);
        sorter.sort(data);

        strategy = new InsertionSortStrategy();
        sorter.setStrategy(strategy);
        sorter.sort(data);
    }
}

以上是策略模式的完整攻略,通过两个示例的讲解,你应该能够更好地理解策略模式的概念,以及在实际开发中如何应用策略模式来解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 设计模式中的策略模式详情 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java 获取日期的几天前,几个月前和几年前的实例

    获取日期的几天前、几个月前和几年前可以使用Java中的Calendar类来实现。具体步骤如下: 1.通过Calendar.getInstance()方法获取当前时间的Calendar实例。 2.使用Calendar类的add方法修改时间,其中第一个参数是修改时间的字段(例如,Calendar.DAY_OF_YEAR表示修改年中的天数),第二个参数是修改的值,…

    Java 2023年5月20日
    00
  • 图解Java中插入排序算法的原理与实现

    插入排序算法的原理与实现 一、插入排序算法的原理 插入排序是一种简单的排序算法,其基本思想是构建有序序列,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应位置插入。插入排序和冒泡排序一样,也属于交换排序的一种。 插入排序的核心思想是将未排序的数据插入有序序列中的合适位置,具体分以下两个步骤: 从第一个元素开始,默认这个元素是有序的序列,将下一个元素与…

    Java 2023年5月19日
    00
  • 解决springboot启动失败的问题(‘hibernate.dialect’ not set)

    当你在SpringBoot应用程序中使用Hibernate时,可能会遇到 “hibernate.dialect”没有设置的启动失败问题。这个问题的原因是Hibernate试图查找一个匹配的SQL方言,但没有找到。下面是解决“hibernate.dialect not set”问题的完整攻略: 问题分析 首先,我们需要了解该问题的主要原因。在Hibernate…

    Java 2023年5月20日
    00
  • Java 动态模拟操作系统进程调度算法

    Java 动态模拟操作系统进程调度算法攻略 简介 在操作系统中,进程调度算法是非常重要的一个部分。操作系统需要根据不同的算法,按照一定的规则来决定哪个进程应该被执行。一种常见的调度算法是进程优先级调度算法。本攻略将演示如何使用Java语言动态模拟进程优先级调度算法。 实现 首先,定义一个Process类,代表一个进程,其中包含三个成员变量:进程名、进程优先级…

    Java 2023年5月19日
    00
  • Java的异常类型总结

    以下是Java的异常类型总结的完整攻略: Java的异常类型总结 在Java程序中,当运行时出现异常情况时会抛出异常,这时程序会中断并把错误信息输出到控制台。Java中异常分为两种类型:已检查异常和未检查异常。 已检查异常(Checked Exceptions) 已检查异常是指在编写Java程序时,编译器要求必须对可能出现该异常的代码进行处理或者声明抛出异常…

    Java 2023年5月27日
    00
  • java动态口令登录实现过程详解

    Java动态口令登录实现过程详解 什么是动态口令 动态口令是指使用时间限制的口令。 不同于常规的静态口令,动态口令需要设备生成一次性密码,具有更高的安全性。 动态口令登录的实现过程 用户在登录页面输入用户名和密码,提交表单给后端服务器。 后端服务器接收到表单后,根据用户名查询数据库中存储的该用户的密钥。 后端服务器随机生成一个6位数的随机数,并使用密钥生成一…

    Java 2023年5月26日
    00
  • JSP 2.1和JSF 1.2规范发布预览版本

    JSP 2.1和JSF 1.2是Java Web开发中的两个重要组件,用于开发动态网页和构建用户界面。在发布预览版本之前,我们需要进行一些准备工作。 1. 准备环境 在开始使用JSP 2.1和JSF 1.2之前,我们需要确保环境已经准备好。具体来说,我们需要安装JDK 1.5或更高版本,以及一个兼容的Web服务器。 2. 下载规范 JSP 2.1和JSF 1…

    Java 2023年5月23日
    00
  • Linux CentOS下安装Tomcat9及web项目的部署

    下面我将详细讲解“Linux CentOS下安装Tomcat9及web项目的部署”的完整攻略。首先,假设你已经在CentOS上安装好了Java环境。 安装Tomcat9 下载Tomcat9二进制包 可以在Tomcat官网下载最新版的Tomcat9二进制包:https://tomcat.apache.org/download-90.cgi 解压Tomcat9二…

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