1.面向对象的三大特性
封装、继承和多态是大家耳熟能详的词语了,那如何在代码中实现估计有很多人还是懵逼的,今天就让我们从初级程序员、中级程序员和高级程序员的代码实现中,体会这个三个特性吧。
2.需求描述
请用C++、Java、C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
3.计算器逻辑实现-初级程序员
java
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.println("请输入一个数字");
String a = scanner.nextLine(); // 读取一行文本
System.out.println("请输入计算符号(+ - * /)");
String b = scanner.nextLine(); // 读取一行文本
System.out.println("请输入一个数字");
String c = scanner.nextLine(); // 读取一行文本
BigDecimal result = null;
if ("+".equals(b)) {
result = new BigDecimal(a).add(new BigDecimal(c));
}
if ("-".equals(b)) {
result = new BigDecimal(a).subtract(new BigDecimal(c));
}
if ("*".equals(b)) {
result = new BigDecimal(a).multiply(new BigDecimal(c));
}
if ("/".equals(b)) {
result = new BigDecimal(a).divide(new BigDecimal(c));
}
System.out.println(result);
}
}
4. 计算器逻辑实现-中级程序员
优化点:将计算逻辑和显示逻辑分开,计算逻辑单独封装,代码如下:
java
public class Operator {
public static BigDecimal calculate(String operator, String numA, String numB) {
BigDecimal result = null;
switch(operator){
case "+":
result = new BigDecimal(numA).add(new BigDecimal(numB));
break;
case "-":
result = new BigDecimal(numA).subtract(new BigDecimal(numB));
break;
case "*":
result = new BigDecimal(numA).multiply(new BigDecimal(numB));
break;
case "/":
BigDecimal tmpNumB = new BigDecimal(numB);
if(tmpNumB.compareTo(BigDecimal.ZERO) != 0) {
result = new BigDecimal(numA).divide(tmpNumB);
}
break;
default:
break;
}
}
}
java
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.println("请输入一个数字");
String numA = scanner.nextLine(); // 读取一行文本
System.out.println("请输入计算符号(+ - * /)");
String operator = scanner.nextLine(); // 读取一行文本
System.out.println("请输入一个数字");
String numB = scanner.nextLine(); // 读取一行文本
BigDecimal result = Operator.calculate(operator, numA, numB);
System.out.println(result);
}
}
5. 计算器逻辑实现-高级程序员
优化点:使用简单工厂模式增强代码的扩展性,完美体现面向对象的封装、继承、多态三大特性。
5.1 对计算符号及逻辑进行抽象
java
public abstract class Operator {
abstract BigDecimal calculate(String numA, String numB);
}
class AddOperator extends Operator {
@Override
BigDecimal calculate(String numA, String numB) {
return new BigDecimal(numA).add(new BigDecimal(numB));;
}
}
class SubOperator extends Operator {
@Override
BigDecimal calculate(String numA, String numB) {
return new BigDecimal(numA).subtract(new BigDecimal(numB));
}
}
class MultiplyOperator extends Operator {
@Override
BigDecimal calculate(String numA, String numB) {
return new BigDecimal(numA).multiply(new BigDecimal(numB));;
}
}
class DivideOperator extends Operator {
@Override
BigDecimal calculate(String numA, String numB) {
BigDecimal tmpNumB = new BigDecimal(numB);
if(tmpNumB.compareTo(BigDecimal.ZERO) != 0) {
return new BigDecimal(numA).divide(tmpNumB);
}
}
}
5.2 计算符号工厂代码实现
java
public class OperatorFactory {
public static Operator Operator(String operator) {
Operator operatorInstance = null;
switch (operator) {
case "+":
operatorInstance = new AddOperator();
break;
case "-":
operatorInstance = new SubOperator();
break;
case "*":
operatorInstance = new MultiplyOperator();
;
break;
case "/":
operatorInstance = new DivideOperator();
break;
default:
break;
}
return operatorInstance;
}
}
5.3 最终代码调用
java
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.println("请输入一个数字");
String numA = scanner.nextLine(); // 读取一行文本
System.out.println("请输入计算符号(+ - * /)");
String operator = scanner.nextLine(); // 读取一行文本
System.out.println("请输入一个数字");
String numB = scanner.nextLine(); // 读取一行文本
Operator operatorInstance = OperatorFactory.Operator(operator);
BigDecimal result = operatorInstance.calculate(numA, numB);
System.out.println(result);
}
}