面向控制台的计算器一
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部分的代码完全是可以被复用的。
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)); } } }
面向控制台的计算器三
现在我们只支持加、减、乘、除,但是以后可能需要扩展其它的运算,比如x的y次方。
所以把可能发生变化的部分再次封装,分别封装为加法类、减法类、乘法类、除法类,并让它们共同继承Opration类,也就是定义了一个算法族;并使用简单工厂模式创建具体的类而返回抽象类型(多态)
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; } }
总结:面向对象三大特征,封装性、继承性、多态性。有利于程序的复用性、可扩展性、维护性。