啥也不说,直接上代码
方案一:
public static void main(String[] args) {
System.out.println("请输入数字a");
double a=new Scanner(System.in).nextDouble();
System.out.println("请选择运算符号(+ ,-,*,/): ");
String x=new Scanner(System.in).next();
System.out.println("请输入数字b");
double b=new Scanner(System.in).nextDouble();
BigDecimal a1 = new BigDecimal(a + "");
BigDecimal b1 = new BigDecimal(b + "");
BigDecimal c;
if(x.equals("+")){
c=a1.add(b1);
System.out.println("结果:"+c);
}else if(x.equals("-")){
c=a1.subtract(b1);
System.out.println("结果:"+c);
}else if(x.equals("*")){
c=a1.multiply(b1);
System.out.println("结果:"+c);
}else if(x.equals("/")){
while(b==0){
System.out.println("除数不能为0,请重新输入!");
b=new Scanner(System.in).nextDouble();
b1 = new BigDecimal(b + "");
//throw new ArrayIndexOutOfBoundsException("除数不能为0");
}
c = a1.divide(b1, 3, BigDecimal.ROUND_HALF_UP);
System.out.println("结果:" + c);
}else {
System.out.println("符号输入错误!");
}
}
方案二:
public static void main(String[] args) {
try {
System.out.println("请输入数字a");
double a=new Scanner(System.in).nextDouble();
System.out.println("请选择运算符号(+ ,-,*,/): ");
String x=new Scanner(System.in).next();
System.out.println("请输入数字b");
double b=new Scanner(System.in).nextDouble();
BigDecimal a1 = new BigDecimal(a + "");
BigDecimal b1 = new BigDecimal(b + "");
BigDecimal c;
switch (x){
case "+": c=a1.add(b1);
System.out.println("结果:"+c);break;
case "-": c=a1.subtract(b1);
System.out.println("结果:"+c);break;
case "*": c=a1.multiply(b1);
System.out.println("结果:"+c); break;
case "/": while(b==0) {
System.out.println("除数不能为0,请重新输入!");
b = new Scanner(System.in).nextDouble();
b1 = new BigDecimal(b + "");
}
c = a1.divide(b1, 3, BigDecimal.ROUND_HALF_UP);
System.out.println("结果:" + c);
}
}catch (Exception e){
System.out.println("你的输入有误"+e.getCause());
}
}
第二中相比第一种有一定程度上的优化,但是还有不足点,就是运算符号的控制,只有+ - * / 四种符号,万一用户输错了怎能办,可以用正则表达式来控制,感兴趣的话大家可以试试!
前面两种代码耦合性太高,正常业务中肯定不能这么写的,维护性和可扩展性太差,一般业务中都会对代码进行松耦合,提高程序的可维护性和扩展性;
方案三:
// Operation类
public class TestFactoryModel3Operation {
private BigDecimal numberA;
private BigDecimal numberB;
public BigDecimal getNumberA() {
return numberA;
}
public void setNumberA(BigDecimal numberA) {
this.numberA = numberA;
}
public BigDecimal getNumberB() {
return numberB;
}
public void setNumberB(BigDecimal numberB) {
this.numberB = numberB;
}
public BigDecimal getresult(){
BigDecimal result=null;
return result;
}
}
因为现在我们只考虑两个数之间的运算,所以可以将这两个数进行封装,外部利用set和get方法获取和设置值,再添加一个getresult方法来获取两个数的运算结果,后期如果再对多个数进行运算时采用例似的方法就行,如果要添加其他的运算,比如开平方,此段代码根本就不用动,只需要修改后面的就行,可展现提高很多,也实现了松耦合的思想。
//加法运算
class OperationAdd extends TestFactoryModel3Operation{
@Override
public BigDecimal getresult(){
BigDecimal result=null;
result=getNumberA().add(getNumberB());
return result;
}
}
//减法运算
class OperationSub extends TestFactoryModel3Operation{
@Override
public BigDecimal getresult(){
BigDecimal result=null;
result=getNumberA().subtract(getNumberB());
return result;
}
}
//乘法运算
class OperationMul extends TestFactoryModel3Operation{
@Override
public BigDecimal getresult(){
BigDecimal result=null;
result=getNumberA().multiply(getNumberB());
return result;
}
}
//除法运算
class OperationDiv extends TestFactoryModel3Operation{
@Override
public BigDecimal getresult(){
BigDecimal result=null;
result= getNumberA().divide(getNumberB(),3, RoundingMode.HALF_UP);
return result;
}
}
加减乘除四个操作分开写,都继承TestFactoryModel3Operation类,以便后期重写该类中的getresult方法来获取计算结果,
后期如果要添加其他的运算,只需再写一个类就行(比如开平方运算,幂运算等)
//简单工厂类,主要用来创建对象
class OperationFactory{
public static TestFactoryModel3Operation createOperation(String operate){
TestFactoryModel3Operation oper=null;
switch (operate){
case "+": oper=new OperationAdd();break;
case "-": oper=new OperationSub();break;
case "*": oper=new OperationMul();break;
case "/": oper=new OperationDiv();break;
}
return oper;
}
}
利用简单工厂模式来实例化对象,但是具体要实例化哪个呢?是怎么来区分的呢?,当然是根据用户输入的运算符号来确定的,createOperation(String operate) ,根据该方法的传入的参数来确定实例化那个运算类的对象,从而执行具体的方法进行运算,最后再重写getresult方法来获取值;
//客户端类
class Cliet{
public static void main(String[] args) {
try {
System.out.println("请输入数字a");
double a=new Scanner(System.in).nextDouble();
System.out.println("请选择运算符号(+ ,-,*,/): ");
String x=new Scanner(System.in).next();
System.out.println("请输入数字b");
double b=new Scanner(System.in).nextDouble();
TestFactoryModel3Operation oper;
oper = OperationFactory.createOperation(x);
BigDecimal a1 = new BigDecimal(a+"");
BigDecimal b1 = new BigDecimal(b+"");
oper.setNumberA(a1);
oper.setNumberB(b1);
BigDecimal result = oper.getresult();
System.out.println("结果是:"+result);
}catch (Exception e){
System.out.println("输入有误"+e.getCause());
}
}
}
main方法,程序入口,用来调用之前的类,由于用户可能会输入不合规的字符,所以利用try catch来捕获异常,(注意一下,我用的一直都是BigDecimal),当然也可以用double,不过会出现计算不精确的问题,
根据运算符来确定要实例化那个对象:
TestFactoryModel3Operation oper;
oper = OperationFactory.createOperation(x);
给numberA和number B两个数赋值:
BigDecimal a1 = new BigDecimal(a+"");
BigDecimal b1 = new BigDecimal(b+"");
oper.setNumberA(a1);
oper.setNumberB(b1);
调用重写后的方法来获取计算得出的值:
BigDecimal result = oper.getresult();
System.out.println("结果是:"+result);