啥也不说,直接上代码

方案一:

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);