详解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与Spring boot后端项目Bug超全总结

    Java与Spring Boot后端项目Bug超全总结 为什么会有Bug Bug是不可避免的,尤其是在软件开发的过程中。它们可能由多种原因引起,例如人为疏忽、缺少测试、设计错误或未能理解业务需求。在Java和Spring Boot后端项目中,由于开发过程通常比较复杂,可能出现更多的Bug。以下是一些解决这些问题的技术和策略。 解决Bug的技巧和策略 1. 编…

    Java 2023年6月16日
    00
  • Java如何实现简单的RPC框架

    RPC(Remote Procedure Call)是一种面向服务的RPC(Remote Procedure Call)请求响应协议。 Java提供了众多实现RPC框架的库,其中比较著名的有Dubbo、Thrift、 gRPC等。下面我们以Dubbo框架为例,详细讲解Java如何实现简单的RPC框架。 1. Dubbo框架简介 Dubbo是一个RPC框架,支…

    Java 2023年5月18日
    00
  • mybatis基本实例详解

    Mybatis基本实例详解 Mybatis是一款开源的持久化框架,它可以将数据库的操作和Java代码解耦,大大简化了数据访问层的开发。本文将介绍Mybatis基本实例,包含如下内容: Mybatis简介 Mybatis基本配置 Mybatis增删改查示例1 Mybatis增删改查示例2 Mybatis简介 Mybatis是一款优秀的持久层框架,它为Java开…

    Java 2023年5月20日
    00
  • Java网络编程之入门篇

    Java网络编程之入门篇 简介 网络编程是Java编程中不可或缺的一部分。Java提供了许多类和接口,支持Socket编程和URL编程,使得Java开发者可以轻松地构建并运行基于网络的应用程序。 本文将介绍Java网络编程的入门知识,包括Socket编程和URL编程的基本概念和示例。 Socket编程 Socket编程提供了与远程主机通信的机制。Java提供…

    Java 2023年5月19日
    00
  • Java集合中的fail-fast(快速失败)机制详解

    Java集合中的fail-fast(快速失败)机制详解 简介 Java集合中的fail-fast机制,指在对集合进行遍历操作的过程中,若集合的结构被修改了(增、删、改),那么程序便会抛出并发修改异常ConcurrentModificationException,终止遍历操作,从而避免因对已经被修改的集合进行操作而导致数据不一致等问题的产生。 fail-fas…

    Java 2023年5月28日
    00
  • Java中的ArithmeticException是什么?

    ArithmeticException是Java中的一个异常类,用来表示算术异常,这个异常通常在进行数学运算时可能会出现,比如除数为0、模数为0等情况都会抛出这个异常。 ArithmeticException属于RuntimeException的子类,它表示在进行数学计算时抛出的异常,当出现这个异常时,程序会停止运行并抛出异常信息,使程序无法正常工作。 在J…

    Java 2023年4月27日
    00
  • Windows系统下安装Tomcat服务器和配置虚拟目录的方法

    安装Tomcat服务器: 下载Tomcat安装包:到官网 https://tomcat.apache.org/ 下载指定版本的Tomcat安装包,目前比较常用的版本是8和9。 解压Tomcat安装包:在Windows系统下,将Tomcat安装包解压到指定文件夹,如D盘的Tomcat目录下。 设置环境变量:在Windows系统环境变量中新增一个CATALINA…

    Java 2023年5月19日
    00
  • 最新log4j2远程代码执行漏洞(附解决方法)

    最新log4j2远程代码执行漏洞攻略 漏洞概述 最新log4j2远程代码执行漏洞是指在使用log4j2时,攻击者可以通过构造特定的日志消息触发log4j2的JNDI注入漏洞,从而远程执行恶意代码。这个漏洞已经被证实存在于log4j 2.0-2.14.1版本中。 漏洞利用 攻击者可以通过构造以下payload来触发漏洞: %(u+g)(o=GooGN6NDxy…

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