1.题目
请编写一个计算器,看似题目简单,有深坑哦
初学者的写法:
Scanner read=new Scanner(System.in);
....println("请输入第一个数:");
num1=....nextInt();
....println("请输入符号位:");
operater=....next();
....println("请输入第二个数:");
num2=....nextInt();
int result =0;
switch(operater){
......
}
println("结果为:"+result);
指出问题:
一:页面与逻辑混为一谈
二:比如说我要添加新需求,此时就需要添加case分支,导致其他运算逻辑暴露
解决问题1:
将页面与运算逻辑剥离出来
创建一个Operation类,其中有个静态成员方法 进行运行
Operation类
public static getResult(int num1,String opreate,int num2){
int result =0;
switch(operater){
......
}
return result;
}
主类
Scanner read=new Scanner(System.in);
....println("请输入第一个数:");
num1=....nextInt();
....println("请输入符号位:");
operater=....next();
....println("请输入第二个数:");
num2=....nextInt();
int result=Operation.getResult(num1,operater,num2);
...println(result);
注意:到此为止已经将页面与逻辑代码分离,这时如果说只需要添加其他运算符,只需要改运算类,不涉及页面! (此时用到了java 的三大特性之一 封装)
解决问题2:
通过继承多态两大特性 解决添加修改算法不需要暴露其他算法的问题
考虑 可以通过继承 让算法逻辑实现Operation类 这样运算添加只需继承Operation类 自定义运算逻辑就可以 删除直接删除子类 ,这就是所谓的低耦合
修改operation为abstract类(为何非要定义成abstract类,请了解下百度,本人语言组织能力有限,,,,)
定义两个私有化变量,提供getset方法,在提供一个公用abstract的getresult方法,用于自定义运算逻辑并返回
Operation类
//数字1
private int num1;
//数字2
private int num2;
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
/**
* 获取结果
* @return
*/
public abstract int getResult();
SumOperater类
@Override
public int getResult() {
int result=getNum1()+getNum2();
return result;
}
SubOperation类
@Override
public int getResult() {
int result=getNum1()-getNum2();
return result;
}
此时虽然通过继承实现了分离,但却无法知道使用了哪个运算符,通过工厂设计模式结合多态可以实现.不同的operate实例不同的对象,
首选创建一个工厂类
OperationFactory
public static Operation createOperation(String operate){
Operation operation=null;
switch (operate) {
case "+":
operation=new SumOperation();
break;
case "-":
operation=new SubOperation();
break;
default:
break;
}
return operation;
}
主类
Scanner scanner=new Scanner(System.in);
System.out.println("请输入第一个数:");
int num1 = scanner.nextInt();
System.out.println("请输入符号位:");
String operate = scanner.next();
System.out.println("请输入第二个数:");
int num2 = scanner.nextInt();
Operation createOperation = OperationFactory.createOperation(operate);
createOperation.setNum1(num1);
createOperation.setNum2(num2);
int result = createOperation.getResult();
System.out.println(result);
到此,工厂设计模式就讲解完毕!