大话设计模式学习笔记--简易计算器(简单工厂)

需求:使用面向对象的思想实现一个简易计算器,可以进行+、-、*、/运算。

可能你觉得这是一个很简单的题目,如是你不会思考太多,就会马上着手开始写代码,你写的代码可能会是这样。

import java.util.Scanner;
/**
 * 需求:完成一个简易计算器
 * 可以实现+、-、*、/运算
 * 菜鸟实现:
 */
public class TestCount1 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入第一个操作数:");
String number1 = sc.next();
System.out.print("请输入操作符:");
String flag = sc.next();
System.out.print("请输入第二个操作数:");
String number2 = sc.next();
double num1;
double num2;
char operator = flag.charAt(0);
try {
num1 = Double.parseDouble(number1);
num2 = Double.parseDouble(number2);
} catch(Exception e) {
System.out.println("请输入正确的数值!");
return;
}
double result = 0.0;
switch (operator) {
case '+' : result = num1 + num2;
   break;
case '-' : result = num1 - num2;
break;
case '*' : result = num1 * num2;
break;
case '/' : if (num2 == 0) {
System.out.println("被除数不能为0");
return;
}
result = num1 / num2;
break;
default:System.out.println("请输入正确的操作符");return;
}
System.out.println(num1 + "" + flag.charAt(0) + "" + num2 + "=" + result);
}
}

写完这段代码时,可能你会沾沾自喜,觉得这题目台简单了,但是如果现在需求改变了呢,要求加法运算执行完之后要乘与0.8呢,那你的代码又要怎么样修改呢。如是你觉得之前的程序一塌糊涂,开始这样子写代码,你写的代码可能是这样。

import java.util.Scanner;
/**
 * 需求:使用面向对象的思想完成一个简易计算器
 * 可以实现+、-、*、/运算
 * 初级程序员实现:封装
 */
public class TestCount2 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入第一个操作数:");
String number1 = sc.next();
System.out.print("请输入操作符:");
String flag = sc.next();
System.out.print("请输入第二个操作数:");
String number2 = sc.next();
try {
double result = Operator.getResult(number1, flag, number2);
System.out.println("运算结果:" + result);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

public class Operator {

//初级程序员
public static double getResult(String number1, String flag, String number2) {
double num1;
double num2;
char operator = flag.charAt(0);
try {
num1 = Double.parseDouble(number1);
num2 = Double.parseDouble(number2);
} catch(Exception e) {
throw new RuntimeException("请输入正确的数值!");
}
double result = 0.0;
switch (operator) {
case '+' : result = num1 + num2;
   break;
case '-' : result = num1 - num2;
break;
case '*' : result = num1 * num2;
break;
case '/' : if (num2 == 0) {
throw new RuntimeException("被除数不能为0");
}
result = num1 / num2;
break;
default: throw new RuntimeException("请输入正确的操作符");
}
return result;

}

}

此刻,你会感觉自己写的代码有点与众不同了,也开始想面向对象编程了,但是这只是一个简单的封装,面向对象的继承和多态呢,你是否使用了呢。

过了一段时间,可能你会这样子写代码。

public class Operator {

//中级程序员
public static double getResult(String number1, String flag, String number2) {
double num1;
double num2;
char operator = flag.charAt(0);
try {
num1 = Double.parseDouble(number1);
num2 = Double.parseDouble(number2);
} catch(Exception e) {
throw new RuntimeException("请输入正确的数值!");
}
double result = 0.0;
Count count;
switch (operator) {
case '+' : count = new AddCount();
result = count.count(num1, num2);
   break;
case '-' : count = new SubCount();
result = count.count(num1, num2);
break;
case '*' : count = new MutilCount();
result = count.count(num1, num2);
break;
case '/' :  count = new DivCount();
result = count.count(num1, num2);
break;
default: throw new RuntimeException("请输入正确的操作符");
}
return result;

}

}

public class Count {
public double count(double num1, double num2) {
return 0;
}
}


public class AddCount extends Count {

public double count(double num1, double num2) {
return num1 + num2;
}

}

public class SubCount extends Count {

public double count(double num1, double num2) {
return num1 - num2;
}

}

public class MutilCount extends Count {

public double count(double num1, double num2) {
return num1 * num2;
}

}

public class DivCount extends Count {

public double count(double num1, double num2) {
if (num2 == 0) {
throw new RuntimeException("被除数不能为0");
}
return num1 / num2;
}

}

这时候,你想到了把运算抽取出来作为一个类,对不同的运算,则继承这一个类,实现了可拓展、可维护,也使用了多态,具有灵活性。确实挺不错的了,但是是否还可以完善呢,如果现在需求要增加一个平方根的计算,你会怎么样做呢,你是否会改动很大的已有代码。可能你会这样子做。

public class Operator {

//高级程序员 继承、多态、简单工厂
public static double getResult(String number1, String flag, String number2) {
double num1;
double num2;
char operator = flag.charAt(0);
try {
num1 = Double.parseDouble(number1);
num2 = Double.parseDouble(number2);
} catch(Exception e) {
throw new RuntimeException("请输入正确的数值!");
}
//简单工厂
Count count = CountFactory.createCount(operator);
return count.count(num1, num2);
}
}

public class CountFactory {
public static Count createCount(char operator) {
Count count = null;
switch (operator) {
case '+' : count = new AddCount();
   break;
case '-' : count = new SubCount();
break;
case '*' : count = new MutilCount();
break;
case '/' :  count = new DivCount();
break;
default: throw new RuntimeException("请输入正确的操作符");
}
return count;
}

}

如果对于刚刚的需求,你只需要修改工厂里面的分支语句和增加一个平方根的类即可。这样子是否好很多呢。如果对于这个需求,你用刚刚开始的那些程序实现,改动又会是怎么样呢。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值