详解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基础之Bean的创建、定位和使用

    Java基础之Bean的创建、定位和使用 在Java开发中,Bean是非常常用的一种Java类。Bean是一种被特殊编写的Java类,通常用于封装和传输数据,它拥有以下几个特点: 具有无参构造器 具有getter/setter方法 实现序列化接口 下面我们将对Bean的创建、定位和使用进行详细讲解。 Bean的创建 JavaBean的创建需要满足上述特点,以…

    Java 2023年5月26日
    00
  • Struts2和Ajax数据交互示例详解

    下面我将详细讲解“Struts2和Ajax数据交互示例详解”的完整攻略,包含以下几个部分: 概述:介绍本文的主要内容和目标。 环境配置:介绍Struts2和Ajax数据交互的环境配置。 示例1:使用Struts2和Ajax实现表单提交,并异步显示提交结果。 示例2:使用Struts2和Ajax实现无刷新分页查询。 1. 概述 本文将介绍如何实现 Struts…

    Java 2023年5月20日
    00
  • jsp+Servlet编程实现验证码的方法

    下面我来详细讲解“jsp+Servlet编程实现验证码的方法”的完整攻略。 什么是验证码? 验证码(CAPTCHA)是指计算机应用程序为区分用户是真实用户还是计算机程序而推出的一种测试。常见的验证码类型包括数字、字母、滑块等形式,用户需要正确地填写系统生成的图形码信息才能进行下一步操作。 实现验证码的原理 验证码的实现原理是利用了Web开发中的Session…

    Java 2023年6月15日
    00
  • Java压缩文件工具类ZipUtil使用方法代码示例

    下面我来详细介绍一下“Java压缩文件工具类ZipUtil使用方法代码示例”的完整攻略。 一、ZipUtil工具类介绍 ZipUtil是一个Java压缩文件工具类,它可以将文件或文件夹压缩为zip格式的压缩包,并可以对压缩包进行解压操作。ZipUtil支持中文文件名,可以压缩包含中文文件名的文件或文件夹。 使用ZipUtil前需要导入依赖: <depe…

    Java 2023年5月20日
    00
  • Java实现数字转成英文的方法

    Java实现数字转成英文的方法可以分为以下步骤: 先将数字分解成各位数,例如数字1234应被分解为1,2,3,4这几个单独的数字; 将分解后的各个数字转换为对应的英文单词,例如数字1应该被转换为one,数字2应该被转换为two; 将各个数字单词通过相应的方式拼接成一个完整的英文单词,即实现数字转成英文的任务。 具体实现可以使用Java的数组、循环等方法。示例…

    Java 2023年5月27日
    00
  • win10启动docker报错,错误码 0xffffffff

      一、注册表修复(如果有就不用管) 在\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\添加了一个项392EB46D(不重复即可) 名称 类型 值 进制 AppFullPath 字符串值 C:\Windows\System32\ws…

    Java 2023年4月18日
    00
  • java随机字符串生成示例

    当我们需要在Java应用程序中生成随机字符串时,可以使用Java中的Random类来实现。下面是一个完整的Java随机字符串生成示例攻略: 1. 导入Random类 import java.util.Random; 2. 定义随机生成字符串的方法 public static String generateRandomString(int length) { …

    Java 2023年5月26日
    00
  • SpringBoot上传文件大小受限问题的解决办法

    关于SpringBoot上传文件大小受限问题的解决办法,在此提供完整攻略和两条示例。 问题描述 在SpringBoot的应用中,上传文件大小默认限制为1MB,如果上传的文件超过1MB,就会导致上传失败或无法上传。解决这个问题的方法就是通过设置最大的上传文件大小来解决。 解决办法 SpringBoot提供了两个配置参数来解决上传文件大小的限制问题。 1. 使用…

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