- 首先在不通过设计模式,实现简单计算器程序,简单代码如下:
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通过设计模式,实现简单计算器程序 // 1、接受控制台输入 System.out.println("*****计算器程序*****"); System.out.println("输入第一个操作数"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("输入运算符"); String opr = scanner.nextLine(); System.out.println("输入第二个操作数"); String strNum2 = scanner.nextLine(); double result = 0; // 2、进行运算 if ("+".equals(opr)){ result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2); } // 3、返回结果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
运行结果:*****计算器程序*****
输入第一个操作数
5
输入运算符
*
输入第二个操作数
6
5*6=30.0 - 由于除法运算中,分母不能为零。简单优化后的代码如下:
public class MainClass { public static void main(String[] args) { //在不通过设计模式,实现简单计算器程序 // 1、接受控制台输入 System.out.println("*****计算器程序*****"); System.out.println("输入第一个操作数"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("输入运算符"); String opr = scanner.nextLine(); System.out.println("输入第二个操作数"); String strNum2 = scanner.nextLine(); double result = 0; // 2、进行运算 if ("+".equals(opr)){ result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ if (Double.parseDouble(strNum2) == 0d){ throw new java.lang.ArithmeticException("分母不能为零"); }else{ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);} } // 3、返回结果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
- 以上的代码有哪些缺陷
缺点:完全的面向过程设计,缺少代码重用。(比如,增加求平方等等) - 用面向对象思想实现
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName Operation * @Description TODO * @Author Feng * @Date 2019/3/25 14:53 **/ public abstract class Operation { private double num1; private double num2; public double getNum1() { return num1; } public void setNum1(double num1) { this.num1 = num1; } public double getNum2() { return num2; } public void setNum2(double num2) { this.num2 = num2; } public abstract double getResult(); }
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName AddOperation * @Description TODO * @Author Feng * @Date 2019/3/25 14:55 **/ public class AddOperation extends Operation { @Override public double getResult() { double result = this.getNum1() + this.getNum2(); return result; } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通过设计模式,实现简单计算器程序 // 1、接受控制台输入 System.out.println("*****计算器程序*****"); System.out.println("输入第一个操作数"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("输入运算符"); String opr = scanner.nextLine(); System.out.println("输入第二个操作数"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、进行运算,大家可以看到加法运算中,还需要知道,new实例化一个AddOperation,我们不希望使用实例化,那么就用工厂模式来实现。 if ("+".equals(opr)){ Operation addOperation = new AddOperation(); addOperation.setNum1(num1); addOperation.setNum2(num2); result = addOperation.getResult(); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ if (Double.parseDouble(strNum2) == 0d){ throw new java.lang.ArithmeticException("分母不能为零"); }else{ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);} } // 3、返回结果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
- 简单工厂模式实现
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName OperationFactory * @Description TODO * @Author Feng * @Date 2019/3/25 15:58 **/ public class OperationFactory { public static Operation getOperation(String opr){ if ("+".equals(opr)){ return new AddOperation(); } return null; } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通过设计模式,实现简单计算器程序 // 1、接受控制台输入 System.out.println("*****计算器程序*****"); System.out.println("输入第一个操作数"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("输入运算符"); String opr = scanner.nextLine(); System.out.println("输入第二个操作数"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、进行运算,后续我们只需要修改工厂类,客户端MainClass不需要任何修改了。 Operation operation = OperationFactory.getOperation(opr); operation.setNum1(num2); operation.setNum2(num1); result = operation.getResult(); // 3、返回结果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
同理减法运算代码:
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName SubOperation * @Description TODO * @Author Feng * @Date 2019/3/25 16:05 * 同理减法运算 **/ public class SubOperation extends Operation { @Override public double getResult() { double result = this.getNum1() - this.getNum2(); return result; } }
我们只需要修改OperationFactory判断逻辑即可:
public class OperationFactory { public static Operation getOperation(String opr){ if ("+".equals(opr)){ return new AddOperation(); }else if ("-".equals(opr)){ return new SubOperation(); } return null; } }
- OperationFactory实际上是一个具体的实现类。我们可以优化如下。
// OperationFactory修改为接口
public interface OperationFactory {public Operation getOperation(String opr); }
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName AddOperationFactory * @Description TODO * @Author Feng * @Date 2019/3/25 16:36 **/ public class AddOperationFactory implements OperationFactory { @Override public Operation getOperation() { return new AddOperation(); } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通过设计模式,实现简单计算器程序 // 1、接受控制台输入 System.out.println("*****计算器程序*****"); System.out.println("输入第一个操作数"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("输入运算符"); String opr = scanner.nextLine(); System.out.println("输入第二个操作数"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、进行运算,好处在于增加其他运算规则的情况下,我们只需要增加相应的AddOperationFactory/AddOperation if ("+".equals(opr)){ AddOperationFactory addOperationFactory = new AddOperationFactory(); Operation operation = addOperationFactory.getOperation(); operation.setNum1(num1); operation.setNum2(num2); result = operation.getResult(); } // 3、返回结果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }