使用 Java 策略模式实现计算器

在软件开发中,设计模式是一种为特定场景提供通用解决方案的方式。策略模式是一种行为型设计模式,它允许我们定义一系列算法,将每一个算法封装起来,并使它们可以互换。这样,用户就可以选择任何算法来实现特定的功能。

在本文中,我们将一步步实现一个简单的计算器,使用 Java 的策略模式来支持加法、减法、乘法和除法。让我们先了解一下整个实现的流程。

流程概述

以下是实现计算器的步骤:

步骤 说明
1. 定义策略接口 创建一个接口,定义所有计算策略的方法
2. 实现具体策略 实现加法、减法、乘法和除法策略
3. 创建上下文 创建一个上下文类,用于调用不同的策略
4. 客户端实现 创建一个客户端类,进行策略选择和运算
5. 测试代码 测试我们的计算器是否支持各种运算

接下来,我们将逐步实现这些步骤。

1. 定义策略接口

首先,我们需要定义一个策略接口,该接口将声明所有支持的运算方法。

// CalculatorStrategy.java
public interface CalculatorStrategy {
    double calculate(double num1, double num2);
}

这段代码定义了一个名为 CalculatorStrategy 的接口,其中包含一个名为 calculate() 的方法。该方法接受两个 double 类型的参数,并返回一个 double 类型的结果。

2. 实现具体策略

现在我们需要实现具体的策略类,分别为加法、减法、乘法和除法。

加法策略

// Addition.java
public class Addition implements CalculatorStrategy {
    @Override
    public double calculate(double num1, double num2) {
        return num1 + num2; // 返回两个数的和
    }
}

减法策略

// Subtraction.java
public class Subtraction implements CalculatorStrategy {
    @Override
    public double calculate(double num1, double num2) {
        return num1 - num2; // 返回两个数的差
    }
}

乘法策略

// Multiplication.java
public class Multiplication implements CalculatorStrategy {
    @Override
    public double calculate(double num1, double num2) {
        return num1 * num2; // 返回两个数的积
    }
}

除法策略

// Division.java
public class Division implements CalculatorStrategy {
    @Override
    public double calculate(double num1, double num2) {
        if (num2 == 0) {
            throw new ArithmeticException("除数不能为零"); // 检查除数是否为零
        }
        return num1 / num2; // 返回两个数的商
    }
}

3. 创建上下文

接下来,我们创建一个上下文类 CalculatorContext,用于选择和使用具体策略。

// CalculatorContext.java
public class CalculatorContext {
    private CalculatorStrategy strategy;

    public void setStrategy(CalculatorStrategy strategy) {
        this.strategy = strategy; // 设置计算策略
    }

    public double executeStrategy(double num1, double num2) {
        return strategy.calculate(num1, num2); // 执行策略中的计算方法
    }
}

4. 客户端实现

现在我们实现客户端代码,通过命令行来接收输入,选择不同的策略并进行计算。

// Main.java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        CalculatorContext context = new CalculatorContext();
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入第一个数字:");
        double num1 = scanner.nextDouble();

        System.out.println("请输入第二个数字:");
        double num2 = scanner.nextDouble();

        System.out.println("请选择运算类型:1. 加法 2. 减法 3. 乘法 4. 除法");
        int choice = scanner.nextInt();

        switch (choice) {
            case 1:
                context.setStrategy(new Addition());
                break;
            case 2:
                context.setStrategy(new Subtraction());
                break;
            case 3:
                context.setStrategy(new Multiplication());
                break;
            case 4:
                context.setStrategy(new Division());
                break;
            default:
                System.out.println("无效的选择");
                return;
        }

        double result = context.executeStrategy(num1, num2); // 执行选择的运算
        System.out.println("结果是: " + result);
    }
}

5. 测试代码

至此,我们已经完成了一个简单的计算器的实现。接下来,我们可以运行 Main 类来进行测试。

关系图

通过以上步骤,我们的类之间存在一些关系。下面是它们之间的关系图。

erDiagram
    CalculatorStrategy ||--o{ Addition : implements
    CalculatorStrategy ||--o{ Subtraction : implements
    CalculatorStrategy ||--o{ Multiplication : implements
    CalculatorStrategy ||--o{ Division : implements
    CalculatorContext ||--|| CalculatorStrategy : uses

结尾

通过以上步骤,我们使用 Java 的策略模式成功实现了一个简单的计算器。我们定义了一个策略接口,并实现了几种具体的计算策略。然后通过上下文类管理这些策略,最后在客户端选择所需的策略并执行运算。

这种设计模式的优势在于您可以轻松添加更多的运算策略,而不会影响现有的代码结构。同时,策略模式也提供了更好的单一职责和开闭原则。

希望这个示例能帮助你理解策略模式的基本概念以及如何在 Java 中实现它。通过不断实践与学习,你会对设计模式有更深入的理解!