没用设计模式,简简单单的一个实现计算器,代码如下:
package counter;
import java.util.Scanner;
public class Counter1 {
public static void main(String[] args) {
System.out.println("请输入一个数");
Scanner sc = new Scanner(System.in);
double num1 = sc.nextDouble();
System.out.println("请输入运算符");
String operation = sc.next();
System.out.println("请输入另一个数");
double num2 = sc.nextDouble();
double num = 0;
boolean b = false;
if(operation.equals("+")){
num = num1 + num2;
}else if(operation.equals("-")){
num = num1 - num2;
}else if(operation.equals("*")){
num = num1 * num2;
}else if(operation.equals("/")){
if(num2 == 0){
System.out.println("除数不能为0");
}else{
num = num1/num2;
}
}else{
num = 0;
b = true;
}
if(b){
System.out.println("无结果");
}else{
System.out.println("结果为:" + num);
}
}
}
此代码虽然能实现业务逻辑,但是比较难以扩展。从面向对象角度考虑,重新组织代码后,结果如下所示:
Operation类:
package counter;
public class Operation {
private Double result;
public Double catchResult(double numberA,double numberB,String operate){
if(operate.equals("+")){
result = numberA + numberB;
}else if(operate.equals("-")){
result = numberA - numberB;
}else if(operate.equals("*")){
result = numberA * numberB;
}else if(operate.equals("/")){
if(numberB == 0){
System.out.println("除数不能为0");
}else{
result = numberA/numberB;
}
}else{
result = null;
}
return result;
}
}
此处返回值定义为Double的原因是因为要表示无结果返回的情况!
实现业务逻辑的类的代码如下:
Counter2类:
package counter;
import java.util.Scanner;
public class Counter2 {
public static void main(String[] args) {
System.out.println("请输入一个数");
Scanner sc = new Scanner(System.in);
double num1 = sc.nextDouble();
System.out.println("请输入运算符");
String operation = sc.next();
System.out.println("请输入另一个数");
double num2 = sc.nextDouble();
Operation oper = new Operation();
Double num = oper.catchResult(num1, num2, operation);
if(num == null){
System.out.println("无结果");
}else{
System.out.println("结果为"+num);
}
}
}
此时已经有比较良好的扩展性了。但是还未用到面向对象编程的封装和多态。
使用封装和多态并添加简单工厂模式后,代码如下所示:
操作的虚类为:
OperationAbstract:
package counter; public abstract class OperationAbstract { 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 abstract double getResult(); }
各自的继承类为:
OperationAdd:
OperationSub:package counter; public class OperationAdd extends OperationAbstract{ double Result; public double getResult() { Result = super.getNumberB() + super.getNumberA(); return Result; } }
package counter; public class OperationSub extends OperationAbstract{ double Result; public double getResult() { Result = getNumberA() - getNumberB(); return Result; } }
OperationMul:
OperationDiv:package counter; public class OperationMul extends OperationAbstract{ public double getResult() { double result = 0; result = getNumberA() * getNumberB(); return result; } }
package counter; public class OperationDiv extends OperationAbstract{ public double getResult() { double result = 0; if(getNumberA()==0){ System.out.println("除数不能为0"); }else{ result = getNumberA()/getNumberB(); } return result; } }
主类Counter1:此时,这个简单的计算器程序就应用了简单工厂的设计模式,并且都使用面向对象编程的三个重要特性。此时的代码就有了很好的可扩展性和可维护性。package counter; public class Counter1 { public static void main(String[] args) { OperationAbstract oa; oa = OperationFactory.createOperation(1); oa.setNumberA(3); oa.setNumberB(2); System.out.print("3+2="); System.out.println(oa.getResult()); } }