面向控制台的计算器一java
package com.test.java.features1; import java.util.Scanner; /** * 计算器类 */ public class ComputingCounter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入 stop 关闭计算器"); while (true) { System.out.println("请输入一个数"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个运算符号"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个数"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} compute(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } private static void compute(double number, double number2, String symbol) { switch (symbol) { case "+": System.out.println((number + number2)); break; case "-": System.out.println((number - number2)); break; case "*": System.out.println((number * number2)); break; case "/": System.out.println((number / number2)); break; } } }
代码都写在了一个main方法里,这是面向过程编程。算法
面向控制台的计算器二编程
假如之后需求发生变化,须要写一个面向windows的计算器,计算器一的代码复用性不高;
因此,咱们把计算器一的代码封装为两部分——Client和Opration;Client只负责输入输出,Opration负责后台计算。
这样,若是真的需求变化,要求写一个面向windows的计算器,Opration部分的代码彻底是能够被复用的。windows
package com.test.java.features2; import com.test.java.features2.Opration; import java.util.Scanner; public class Client { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入 stop 关闭计算器"); while (true) { System.out.println("请输入一个数"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个运算符号"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个数"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} Opration.compute(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } }
package com.test.java.features2; public class Opration { public static void compute(double number, double number2, String symbol) { switch (symbol) { case "+": System.out.println((number + number2)); break; case "-": System.out.println((number - number2)); break; case "*": System.out.println((number * number2)); break; case "/": System.out.println((number / number2)); } } }
面向控制台的计算器三ide
如今咱们只支持加、减、乘、除,可是之后可能须要扩展其它的运算,好比x的y次方。
因此把可能发生变化的部分再次封装,分别封装为加法类、减法类、乘法类、除法类,并让它们共同继承Opration类,也就是定义了一个算法族;并使用简单工厂模式建立具体的类而返回抽象类型(多态)spa
package com.test.java.features3; import java.util.Scanner; public class Client { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入 stop 关闭计算器"); while (true) { System.out.println("请输入一个数"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个运算符号"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("请输入一个数"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} Opration.passOn(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } }
package com.test.java.features3; public abstract class Opration { public static void passOn(double number, double number2, String symbol) { Opration opratoin = OprationFactory.getOpratoin(symbol); opratoin.compute(number, number2); } public abstract void compute(double number, double number2); }
package com.test.java.features3; public class Add extends Opration { @Override public void compute(double number, double number2) { System.out.println((number + number2)); } }
package com.test.java.features3; public class Sub extends Opration{ @Override public void compute(double number, double number2) { System.out.println((number - number2)); } }
package com.test.java.features3; public class Multiply extends Opration { @Override public void compute(double number, double number2) { System.out.println((number * number2)); } }
package com.test.java.features3; public class Divide extends Opration { @Override public void compute(double number, double number2) { System.out.println((number / number2)); } }
package com.test.java.features3; public class OprationFactory { public static Opration getOpratoin(String symbol) { switch (symbol) { case "+": return new Add(); case "-": return new Sub(); case "*": return new Multiply(); case "/": return new Divide(); } return null; } }
总结:面向对象三大特征,封装性、继承性、多态性。有利于程序的复用性、可扩展性、维护性。code