小王正在编写一个简单的计算器程序,要求输入两个整数和运算符号(加、减、乘、除),输出计算结果。小王用面向过程方法编写了下面的代码。请采用面向对象方法通过恰当的设计模式对小王的代码进行重构。请写出你所选择的设计模式,画出类图,并给出核心代码。
时间: 2024-10-16 12:18:18 浏览: 19
用python编写的一个用于检验一元二次方程是否有实数根的程序.zip
针对小王的需求,我们可以使用策略设计模式来进行重构。策略模式允许将算法的变化封装成单独的可替换的对象,使得客户端可以选择使用不同的算法。在这个场景下,我们创建一个操作符接口`CalculatorStrategy`,然后为每个基本算术操作(加、减、乘、除)创建一个具体的策略类,如`AdditionStrategy`, `SubtractionStrategy`, `MultiplicationStrategy`, 和 `DivisionStrategy`。
下面是类图示例:
```
+----------------+
| Calculator |
+----------------+
| - strategies |
| + void operate|
| + void setStrategy|
+----------------+
|
v
+---------+ +---------+
| Addition| ... | Division|
+---------+ +---------+
| + int add(int)| ... | + double div(int)|
+---------+ +---------+
```
核心代码如下:
```java
// 计算器接口
public interface CalculatorStrategy {
void calculate(int num1, int num2);
}
// 加法策略
public class AdditionStrategy implements CalculatorStrategy {
@Override
public void calculate(int num1, int num2) {
System.out.println("Result: " + (num1 + num2));
}
}
// 减法策略等其他策略类类似
// 主计算器类
public class Calculator {
private CalculatorStrategy strategy;
// 设置策略
public void setStrategy(CalculatorStrategy strategy) {
this.strategy = strategy;
}
// 运行计算
public void operate(int num1, int num2) {
strategy.calculate(num1, num2);
}
}
```
小王可以像下面这样使用重构后的代码:
```java
Calculator calculator = new Calculator();
calculator.setStrategy(new AdditionStrategy()); // 初始化加法策略
calculator.operate(5, 3); // 输出8
calculator.setStrategy(new SubtractionStrategy()); // 更改为减法策略
calculator.operate(5, 3); // 输出2
```
阅读全文