很经典又基本的一个面试题了,新手基本都会掉进去的坑,还是没有自己的变成思想,哈哈.....
其实主要就是考虑一下使用面向对象和接口,以及计算器的可扩展性,话不多说:
接口:
//运算类接口 public interface Operator { //获取结果 public double getResult(double num1,double num2); }
运算的实现类:
//加法运算 public class AddOperator implements Operator { @Override public double getResult(double num1, double num2) { return num1+num2; } }
//除法 public class DivOperator implements Operator { @Override public double getResult(double num1, double num2) { if(num2!=0){ return num1*num2; }else{ System.out.println("除数不能为0"); return 0; } } }
其他运算类似
运算工厂:
//创建运算类工厂 public class OperatorFactory { //返回运算类对象 public static Operator getOperator(String oper){ if(oper.equals("+")){ return new AddOperator(); }else if(oper.equals("-")){ return new SubOperator(); }else if(oper.equals("*")){ return new MulOperator(); }else if(oper.equals("/")){ return new DivOperator(); }else{ System.out.println("目前不支持这种操作"); return null; } } }
主函数测试:
//使用工厂模式开发一个简单计算器 public class CaclTest { public static void main(String[] args) { System.out.println("请输入第一个数字:"); Scanner scanner=new Scanner(System.in); String num1 = scanner.nextLine(); System.out.println("请输入运算符(+-*/):"); String oper = scanner.nextLine(); System.out.println("请输入第二个数字:"); String num2 = scanner.nextLine(); //通过工厂获取运算类 Operator operator = OperatorFactory.getOperator(oper); if(operator!=null){ if(isDouble(num1) && isDouble(num2)){ double result = operator.getResult(Double.parseDouble(num1), Double.parseDouble(num2)); System.out.println("结果是:"+result); }else{ System.out.println("请输入正确的数字!"); } } } //判断浮点数(double和float) private static boolean isDouble(String str) { if (null == str || "".equals(str)) { return false; } Pattern pattern = Pattern.compile("^[0-9]+(.[0-9]+)?$");//数字,包括整数和浮点 return pattern.matcher(str).matches(); } }
主要考虑一下可能遇到的异常就行了,这里如果以后要增加运算的话,需要改一下工厂类,并添加一个具体运算实现类,想想也挺麻烦的,哈哈