详解Java如何优雅的使用策略模式

详解Java如何优雅的使用策略模式

策略模式(Strategy Pattern)属于行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法的变化独立于使用算法的客户端,客户端通过传递不同的策略对象来使用不同的算法。

在Java里,策略模式的实现有很多种方法,接下来将说明其中一种优雅的实现方式。

1. 定义接口和实现策略

首先,我们定义一个接口来作为策略的基础,并让不同的策略实现这个接口,如下所示:

public interface Strategy {
    int execute(int num1, int num2);
}

public class AddStrategy implements Strategy {
    @Override
    public int execute(int num1, int num2) {
        return num1 + num2;
    }
}

public class SubtractStrategy implements Strategy {
    @Override
    public int execute(int num1, int num2) {
        return num1 - num2;
    }
}

这里定义了一个Strategy接口,包含一个execute方法用于执行算法。接着,我们实现了两个具体的策略:AddStrategySubtractStrategy

2. 如何使用策略

接下来,我们就可以使用策略了。

public class Calculator {
    private Strategy strategy;

    public Calculator(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.execute(num1, num2);
    }

    public static void main(String[] args) {
        Calculator calculator;
        int num1 = 10;
        int num2 = 5;

        calculator = new Calculator(new AddStrategy());
        int sum = calculator.executeStrategy(num1, num2);
        System.out.println("Sum = " + sum);

        calculator = new Calculator(new SubtractStrategy());
        int difference = calculator.executeStrategy(num1, num2);
        System.out.println("Difference = " + difference);
    }
}

这里定义了一个Calculator类,它需要一个Strategy对象来执行算法。在构造函数中,我们传入一个具体的策略对象,然后在executeStrategy方法中调用它的execute方法来执行算法。在main方法中,我们定义了两个数字,并实例化了一个Calculator对象。当我们需要使用不同的算法时,只需要将不同的策略对象传递给Calculator对象即可。

3. 示例1:在线支付的策略模式实现

实际应用中,策略模式经常用于实现在线支付的多种支付方式。

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

public class CreditCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvv;
    private String expiryDate;

    public CreditCardStrategy(String name, String cardNumber, String cvv, String expiryDate) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.expiryDate = expiryDate;
    }

    @Override
    public void pay(double amount) {
        System.out.println(amount + " paid with credit/debit card.");
    }
}

public class PayPalStrategy implements PaymentStrategy {
    private String emailId;
    private String password;

    public PayPalStrategy(String emailId, String password) {
        this.emailId = emailId;
        this.password = password;
    }

    @Override
    public void pay(double amount) {
        System.out.println(amount + " paid using PayPal.");
    }
}

public class ShoppingCart {
    private List<Item> items;

    public ShoppingCart() {
        this.items = new ArrayList<>();
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public void removeItem(Item item) {
        items.remove(item);
    }

    public double calculateTotal() {
        double sum = 0;
        for(Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod) {
        double amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}

public class Item {
    private String name;
    private double price;

    public Item(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

这里定义了PaymentStrategy接口,并实现了两个具体的策略:CreditCardStrategyPayPalStrategy。接着,我们定义了ShoppingCart类和Item类。在ShoppingCart类中,我们包含一个pay方法,使用传入的策略对象来支付购物车内商品的总价格。这个示例使用了聚合关系将Item对象添加到ShoppingCart对象中。

4. 示例2:图形绘制的策略模式实现

另一个示例是使用策略模式来实现图形绘制应用程序中的不同绘制算法。

public interface DrawStrategy {
    void draw();
}

public class DrawLineStrategy implements DrawStrategy {
    @Override
    public void draw() {
        System.out.println("绘制直线");
    }
}

public class DrawCircleStrategy implements DrawStrategy {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

public class GraphEditor {
    private DrawStrategy drawStrategy;

    public void setDrawStrategy(DrawStrategy drawStrategy) {
        this.drawStrategy = drawStrategy;
    }

    public void draw() {
        drawStrategy.draw();
    }
}

public class Client {
    public static void main(String[] args) {
        GraphEditor editor = new GraphEditor();
        editor.setDrawStrategy(new DrawLineStrategy());
        editor.draw();

        editor.setDrawStrategy(new DrawCircleStrategy());
        editor.draw();
    }
}

这里定义了DrawStrategy接口,并实现了两个具体的策略:DrawLineStrategyDrawCircleStrategy。接着,我们定义了GraphEditor类,它包含一个DrawStrategy对象并使用这个对象来绘制图形。最后,在客户端中,我们实例化了GraphEditor对象,并分别设置了DrawLineStrategyDrawCircleStrategy作为绘制策略。

总结

策略模式是一种灵活的、可重用的设计模式,它可以让我们在不修改客户端代码的情况下,使用不同的算法来处理相似的问题。本文介绍了Java中优雅的实现策略模式的方法,并提供了两个具体的示例:实现在线支付的策略模式和图形绘制的策略模式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java如何优雅的使用策略模式 - Python技术站

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

相关文章

  • Java C++实现相同MD5加密算法的方式

    要在Java和C++中实现相同的MD5加密算法,需要借助各自语言中现成的库或函数来实现。以下是详细过程: 1. Java中的MD5加密 Java中实现MD5加密可以使用标准库中的java.security.MessageDigest类。使用该类需要以下步骤: 步骤一:声明MessageDigest对象 MessageDigest md = MessageDi…

    Java 2023年5月19日
    00
  • JDBC板块精华整理20051226

    首先,“JDBC板块精华整理20051226”是一份关于Java数据库连接技术的精华整理资料,它详细介绍了JDBC的基本概念、用法和常见问题解决方法。以下是该攻略的完整内容: JDBC概述 JDBC(即Java Database Connectivity)是一套用于Java编程语言与各种类型的数据库进行连接和操作的API规范。它提供了一个标准的Java接口,…

    Java 2023年6月15日
    00
  • java基础知识之FileInputStream流的使用

    Java基础知识之FileInputStream流的使用 在Java中,FileInputStream(字节流)是用于读取文件的流类之一。该类继承了InputStream类,并且提供了基本的方法来读取数据。 前置知识 在使用FileInputStream类之前,需要掌握以下Java基础知识: 输入/输出流(I/O Stream) Java中的文件操作概念,如…

    Java 2023年5月27日
    00
  • Springboot之自定义全局异常处理的实现

    关于“Springboot之自定义全局异常处理的实现”的完整攻略,我将从以下几个方面进行详细讲解: 为什么需要自定义全局异常处理 Springboot中全局异常处理的实现方式 自定义全局异常处理的实现步骤及示例说明 1. 为什么需要自定义全局异常处理? 在开发过程中,我们经常遇到各种异常情况,如空指针异常、参数异常、文件未找到等等,这些异常会导致程序崩溃或者…

    Java 2023年5月27日
    00
  • 详解Maven POM(项目对象模型)

    详解 Maven POM(项目对象模型) 什么是 Maven POM? Maven POM,即 Project Object Model,是 Maven 中的项目对象模型,它是 Maven 中的基础概念之一,对 Maven 做任何的配置都需要使用到 POM,POM 是 Maven 进行构建时的核心之一。POM 文件会定义项目的基本信息,包括但不限于: 项目组…

    Java 2023年5月20日
    00
  • Java实现矩阵乘法以及优化的方法实例

    Java实现矩阵乘法以及优化的方法实例 背景 矩阵乘法是线性代数中的基本操作,具体实现方法是将两个矩阵进行乘法运算,得到一个新的矩阵。在Java中,我们可以使用循环遍历的方式逐个计算矩阵元素,但是这样效率较低,需要使用优化算法来提高计算速度。 算法介绍 基本矩阵乘法 假设有两个矩阵A(mn),B(np),结果矩阵C(m*p),它们的乘法运算式如下所示: $C…

    Java 2023年5月19日
    00
  • java和js实现的洗牌小程序

    洗牌算法简介 洗牌算法即可将一个包含n个元素的数组打乱,保证每个元素均匀地分布在原数组中。常用的洗牌算法有Fisher–Yates算法(也被称为Knuth-Shuffle算法),其核心思想是将数组从后往前遍历,对于未处理的元素,随机从已处理的元素中选出一个,然后与该元素交换。这样可以保证每个元素被随机地赋予新的位置。 Java实现 Java官方提供了Coll…

    Java 2023年5月23日
    00
  • java中流的使用

    Java中流(Stream)是一种I/O操作的方式,允许我们按照字节或者字符的方式读/写数据。使用流的好处在于不需要将整个文件读入内存中进行操作,而是可以逐个字节或者逐个字符的处理数据,更加高效和灵活。 流的分类 Java中的流分为输入流和输出流两种基本类型。其中,输入流用于读取数据,输出流用于写数据。 输入流 输入流用于读取数据,可以分为字节输入流和字符输…

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