本篇笔记总结于《大话设计模式》
前言
需求:设计一个计算机程序,使用 java实现(这对于每个有一定学习经验的人应该都是小 case)
public class Computer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数");
int num1 = scanner.nextInt();
System.out.println("请输入第二个数");
int num2 = scanner.nextInt();
System.out.println("请输入一个符号");
String sign = scanner.next();
switch (sign){
case "+":
System.out.println(num1+num2);
break;
case "-":
System.out.println(num1-num2);
break;
case "*":
System.out.println(num1*num2);
break;
case "/":
System.out.println(num1/num2);
break;
default:
System.out.println("符号输入有无");
}
}
}
问题1
界面与业务逻辑混在一起,耦合度太高?
所以将代码进行整合
public class Computer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数");
Integer num1 = scanner.nextInt();
System.out.println("请输入第二个数");
Integer num2 = scanner.nextInt();
System.out.println("请输入一个符号");
String sign = scanner.next();
System.out.println();
Integer operate = operate(num1, num2, sign);
System.out.println(operate);
}
// 定义一个操作的方法
public static Integer operate(Integer num1, Integer num2, String sign) {
switch (sign) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
System.out.println("符号输入有无");
return null;
}
}
}
问题2
如果要是再添加一个 乘方 的方法呢?你的答案可能是增加一个case,但是,这种方法不妥,也许一个不注意就修改了其他代码;还有就是如果客户输入的不是数字,健壮性不好
正确设计:使用接口,多态,虚方法
目录
public class Computer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数");
Double num1 = null;
Double num2 = null;
String sign = null;
try {
num1 = scanner.nextDouble();
System.out.println("请输入第二个数");
num2 = scanner.nextDouble();
System.out.println("请输入一个符号");
sign = scanner.next();
} catch (Exception e) {
e.printStackTrace();
}
Double operate = operate(num1, num2, sign);
System.out.println(operate);
}
// 定义一个操作的方法
public static Double operate(Double num1, Double num2, String sign) {
switch (sign) {
case "+":
return new ComputerAdd().getResult(num1,num2,sign);
case "-":
return new ComputerSub().getResult(num1,num2,sign);
case "*":
return new ComputerPow().getResult(num1,num2,sign);
case "/":
return new ComputerDiv().getResult(num1,num2,sign);
default:
System.out.println("符号输入有无");
return null;
}
}
}
代码优化
现在程序写的差不多了,介绍 工厂设计模式:
各个功能相同的类继承或实现父类,然后通过一个工厂函数或类,将创建对象的的责任转移到工厂类或方法(基于输入)
public class Computer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数");
Double num1 = null;
Double num2 = null;
String sign = null;
try {
num1 = scanner.nextDouble();
System.out.println("请输入第二个数");
num2 = scanner.nextDouble();
System.out.println("请输入一个符号");
sign = scanner.next();
} catch (Exception e) {
e.printStackTrace();
}
Double operate = operateFactory(num1, num2, sign);
System.out.println(operate);
}
// 定义一个工厂的方法
public static Double operateFactory(Double num1, Double num2, String sign) {
Operate operate = null;
switch (sign) {
case "+":
operate = new OperateAdd();
break;
case "-":
operate = new OperateAdd();
break;
case "*":
operate = new OperatePow();
break;
case "/":
operate = new OperateDiv();
break;
default:
System.out.println("符号输入有无");
}
return operate.getResult(num1, num2, sign);
}
}
UML图
类与类的关系的介绍 :https://blog.csdn.net/jackfeng44/article/details/109730629