一、功能讲解
面向对象的继承来实现多态,以从工厂里面根据参数类型的不同,初始化不同类型的实例,得到不同的结果。
增加了代码的可复用性,灵活性,可扩展性。
二、示例说明
Input:两个数和操作方式。Example:3 + 3
Output:计算结果。Example:6
三、设计思路
一个Operation父类,包含两个属性来表示两个数,一个getResult方法来获取结果。
每一种操作方式都继承Operation父类,重写getResult方法来达到不同的计算方式。
OperationFactory工厂类,实现一个createOperation方法,根据不同的输入,初始化不同的实例类。
四、类目录结构
五、代码段
Operation父类:
public class Operation {
private double numberA;
private double numberB;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getResult() {
double result = 0;
return result;
}
}
各计算方法子类:
//加法子类
public class OperationAdd extends Operation {
public double getResult() {
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
//减法子类
public class OperationSub extends Operation {
public double getResult() {
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
//乘法子类
public class OperationMul extends Operation {
public double getResult() {
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
//除法子类
public class OperationDiv extends Operation {
public double getResult() {
if (getNumberB() == 0) {
try {
throw new Exception("除数不能为0!");
} catch (Exception e) {
e.printStackTrace();
}
}
double result = 0;
result = getNumberA() / getNumberB();
return result;
}
}
工厂类:
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
default:
try {
throw new Exception("暂不支持的计算方式");
} catch (Exception e) {
e.printStackTrace();
}
}
return operation;
}
}
控制台Main函数:
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
double numberA = scanner.nextDouble();
System.out.println("请输入计算方式(+,-,*,/):");
String operate = scanner.next();
Operation operation = OperationFactory.createOperation(operate);
System.out.println("请输入第二个数:");
double numberB = scanner.nextDouble();
operation.setNumberA(numberA);
operation.setNumberB(numberB);
System.out.println("计算结果为:" + operation.getResult());
}
}
说明:
- 如果需要扩展其他计算方式,新增一个类继承Operation父类,重写getResult方法,在工厂类中新增一个case分支即可。
- 另外交互方式这里只用了Main函数控制台交互,如果需要其他交互方式,计算和工厂代码可复用。