以簡單的計算器實現爲例。
一、普通方法實現簡單計算器。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double NumA;
double NumB;
String sign;
NumA = scan.nextDouble();
NumB = scan.nextDouble();
sign = scan.next();
double result = 0;
switch (sign) {
case "+":
result = NumA + NumB;
break;
case "-":
result = NumA - NumB;
break;
case "*":
result = NumA * NumB;
break;
case "/":
if (NumB != 0) {
result = NumA / NumB;
} else {
System.out.println("除數不能爲0");
}
break;
default:
break;
}
//return result;
}
二、用面向對象的思想去改進代碼--業務邏輯與界面邏輯分開,使他們的耦合度下降;
Operation預算類:
public static double Operation(double NumA, double NumB, String operate) {
double result = 0;
switch (operate) {
case "+":
result = NumA + NumB;
break;
case "-":
result = NumA - NumB;
break;
case "*":
result = NumA * NumB;
break;
case "/":
if (NumB != 0) {
result = NumA / NumB;
} else {
System.out.println("除數不能爲0");
}
break;
default:
break;
}
return result;
}
客戶端代碼:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double NumA;
double NumB;
String sign;
NumA = scan.nextDouble();
NumB = scan.nextDouble();
sign = scan.next();
System.out.println(Operation(NumA, NumB, sign));
}
上面的代碼雖然實現了面向對象中的封裝,但是如果要添加一種計算方式(如:開根運算)還不是很方便,添加一個case的話,其餘的運算也得參與編譯,使代碼存在被二次修改的風險。
三、用繼承和多態進一步解耦;
1.封裝運算類;
public class Operation {
private double NumA;
private double NumB;
public double getNumA() {
return NumA;
}
public void setNumA(double numA) {
NumA = numA;
}
public double getNumB() {
return NumB;
}
public void setNumB(double numB) {
NumB = numB;
}
public double GetResult() {
double result = 0;
return result;
}
}
2.加減乘除類(繼承運算類);
public class AddOperation extends Operation{
@Override
public double GetResult() {
double result = 0;
result = getNumA() + getNumB() ;
return result;
}
public class SubOperation extends Operation {
@Override
public double GetResult() {
double result = 0;
result = getNumA() - getNumB();
return result;
}
public class MulOperation extends Operation{
@Override
public double GetResult() {
double result = 0;
result = getNumA() * getNumB();
return result;
}
}
public class DivOperation extends Operation{
@Override
public double GetResult() {
double result = 0;
if (getNumB()==0)
try {
throw new Exception("除數不能爲0;");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
result = getNumA() / getNumB();
return result;
}
}
3.簡單工廠類(用一個單獨的類來創造容易變化的地方的實例過程),用多態確定選擇的運算。
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new AddOperation();
break;
case "-":
oper = new SubOperation();
break;
case "*":
oper = new MulOperation();
break;
case "/":
oper = new DivOperation();
break;
default:
break;
}
return oper;
}
}
客戶端代碼
public class Main {
public static void main(String[] args) {
Operation oper;
oper = OperationFactory.createOperation("+");
oper.setNumA(2);
oper.setNumB(3);
double result = oper.GetResult();
System.out.println(result);
}
}
經過上述修改的簡單計算器運用面向對象思想,實現封裝、繼承、多態等特性,達到了代碼可複用、可擴展、靈活性好的目的。
四、UML圖