大话设计模式学习笔记--简易计算器(简单工厂)
来源:互联网 发布:java 代码执行adb命令 编辑:程序博客网 时间:2024/06/06 02:52
需求:使用面向对象的思想实现一个简易计算器,可以进行+、-、*、/运算。
可能你觉得这是一个很简单的题目,如是你不会思考太多,就会马上着手开始写代码,你写的代码可能会是这样。
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)】简单工厂模式
- 大话设计模式-简单工厂模式(学习笔记与java实现)
- 大话设计模式-工厂方法模式(学习笔记)
- 简单工厂-简单计算器(仿照《大话设计模式》中示例)
- 大话设计模式笔记——工厂模式(C++计算器实现)
- 大话设计模式 工厂模式 C++计算器
- 大话设计模式 笔记1——简单工厂模式
- 简单工厂模式C++代码示例---《大话设计模式》笔记
- 《大话设计模式》学习笔记——第1章——简单工厂模式
- 大话设计模式学习之简单工厂模式
- iOS UIButton同时设置title和image属性
- Bmob文档阅读6-消息推送
- Eclipse 链接 微软安卓模拟器(windowsAndroid)
- Fragment中监听当前页面是否可以
- extjs4 formpanel 表单布局
- 大话设计模式学习笔记--简易计算器(简单工厂)
- C-006.scanf介绍与基本使用
- 小根堆
- 移动互联网应用数据分析
- 内存管理pbuf.h头文件源码解析——LwIP学习
- ASCII对照表
- 什么是.9图片
- 三种小小的排序之 插入排序,选择排序,冒泡排序
- Google 镜像站搜集