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

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日

相关文章

  • 聊聊Redis的单线程模型

    下面我来详细讲解一下Redis的单线程模型。 Redis的单线程模型 Redis采用单线程模型,每个redis服务进程只有一个线程处理所有客户端的请求。该线程在一个西北曼岛一个时间点处理一个客户端请求,而不是并发处理请求。下面是Redis采用单线程模型的原因: 对于CPU密集型任务,单线程的处理方式可以避免线程间切换所带来的额外开销,提高CPU的利用率; 对…

    Java 2023年5月26日
    00
  • JSP页面无法识别EL表达式问题解决方案

    当JSP页面无法识别EL表达式时,需要考虑两个方面。第一个方面是确认所使用的web容器是否支持EL表达式,第二个方面是确认JSP页面中是否存在错误,导致EL表达式无法正确识别。下面是详细的攻略: 确认web容器是否支持EL表达式 首先,需要确定web.xml文件中是否已经配置了正确的web应用的版本,一般建议选择3.0及以上的版本。具体可配置如下: <…

    Java 2023年6月15日
    00
  • 基于Java开发实现ATM系统

    基于Java开发实现ATM系统的完整攻略 ATM系统是一个常见的银行自动化服务系统,能够提供客户便捷的取款、转账、查询等服务。本文将介绍如何使用Java开发一个简单的ATM系统,主要包含以下步骤: 1. 需求分析 在开始开发之前,需要明确该系统的具体需求,包括系统的功能和用户交互方式等。对于ATM系统,我们可以初步确定以下需求: 用户需要能够登录系统,通过录…

    Java 2023年5月19日
    00
  • 常见的Java网络编程协议有哪些?

    常见的Java网络编程协议有如下几种: TCP/IP协议:TCP/IP协议是互联网传输层协议的基础协议。Java中通过Socket实现TCP/IP协议网络编程。Socket类提供了底层的TCP/IP通信功能,开发者可以使用它来创建基于TCP协议的网络应用程序。 HTTP协议:HTTP协议是Web应用程序中使用得最多的协议。Java中通过HttpURLConn…

    Java 2023年5月11日
    00
  • JAVA IO API使用详解

    Java IO API使用详解 概述 Java IO API是用于读写数据的标准API。Java IO库是一个基于流的库,主要利用了Java中的抽象类和接口来完成对文件的读写操作。 在Java IO库中,主要包括以下三种抽象源: 字节流 字符流 以及文件读写流 字节流 字节流是Java IO库中最基本的流,它支持对字节的输入和输出两种操作。 InputStr…

    Java 2023年5月20日
    00
  • 解决RestTemplate 的getForEntity调用接口乱码的问题

    RestTemplate是Spring框架提供的用于进行HTTP请求的工具,但是在使用getForEntity方法调用接口时,会出现中文乱码的问题。 解决这个问题可以分为两个步骤: 设置RestTemplate的编码方式 在使用RestTemplate的时候,需要设置它的编码方式。可以在创建RestTemplate对象时,传入一个StringHttpMess…

    Java 2023年5月20日
    00
  • SpringBoot快速配置数据源的方法

    SpringBoot快速配置数据源的方法 在SpringBoot中,可以非常简单快速地配置数据源,一般使用Spring Boot Starter来简化开发过程。 步骤1:添加依赖 在pom.xml中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId&gt…

    Java 2023年6月2日
    00
  • Spring纯Java配置集成kafka代码实例

    下面我将详细讲解如何使用Spring纯Java配置集成kafka,包括以下步骤: 添加依赖 配置Kafka 发送消息 接收消息 1. 添加依赖 首先,我们需要在项目的pom.xml中添加kafka相关的依赖,如下所示: <dependency> <groupId>org.springframework.kafka</groupI…

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