很经典又基本的一个面试题了,新手基本都会掉进去的坑,还是没有自己的变成思想,哈哈.....
其实主要就是考虑一下使用面向对象和接口,以及计算器的可扩展性,话不多说:
接口:
//运算类接口
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();
}
}
主要考虑一下可能遇到的异常就行了,这里如果以后要增加运算的话,需要改一下工厂类,并添加一个具体运算实现类,想想也挺麻烦的,哈哈