简单工厂模式:业务逻辑与界面逻辑分开。
这样,当业务逻辑发生改变的时候,只需要改变业务相关的类及其相应的方法,而不需要动整个代码。
书中介绍的一个比较经典的例子就是:四大发明之一--------活体印刷。
活体印刷的好处就是:
一、扩展性(在语句中进行增删)
二、复用性(多个语句可以既=多次使用同一个字)
三、可变性(替换语句中的某个字)
四、灵活性(无论是横式排版还是竖式排版,都比较方便)
设计计算器的运算:
第一:代码的规范性
第二:封装性:“+”“-”“*”“/”。
只做到以上两点,还不够,还应该降低代码的耦合度:即不同的运算规则,应进行分散
第三:继承性 重写计算方法
第四:多态性 通过不同的运算符号,返回不同的运算对象
以下为如何通过面向对象语言来实现计算器功能的code
界面逻辑:
1 public class ResultClient { 2 3 public static void main(String[] args){ 4 Scanner scanner new Scanner(System.in); 5 System.out.println("请输入第一个数字:"); 6 double numberA = 0; 7 try{ 8 numberA = scanner.nextDouble(); 9 }catch(Exception e) { 10 System.out.println("必须输入数字"); 11 e.printStackTrace(); 12 return; 13 } 14 System.out.println("请输入你需要的运算符号:+、-、*、/"); 15 String operation = scanner.next(); 16 Operation operationObj = CreateOperationObj.createOperation(operation); 17 System.out.println("请输入第二个数字:"); 18 double numberB = scanner.nextDouble(); 19 operationObj.setdoubleA(numberA); 20 operationObj.setdoubleB(numberB); 21 System.out.println("运算结果为:"+operationObj.getResult());
业务逻辑:计算方法的model类、创建对应的model
动态创建对应的model
public class CreateOperationObj { public static Operation createOperation(String operation){ Operation operationObj = null; switch(operation){ case "+": operationObj = new OperationAdd(); break; case "-": operationObj = new OperationSub(); break; case "*": operationObj = new OperationMul(); break; case "/": operationObj = new OperationDiv(); } return operationObj; } }
创建model类并重写父类方法
父类
public class Operation { double numberA; double numberB; public double getdoubleA() { return numberA; } public void setdoubleA(double numberA) { this.numberA = numberA; } public double getdoubleB() { return numberB; } public void setdoubleB(double numberB) { this.numberB = numberB; } public double getResult(){ double result = 0; return result; } }
public class OperationAdd extends Operation { public double getResult() { double result = 0; result = numberA+numberB; return result; } }
减法
public class OperationSub extends Operation { public double getResult() { double result = 0; result = numberA-numberB; return result; } }
乘法
public class OperationMul extends Operation { public double getResult() { double result = 0; result = numberA*numberB; return result; } }
除法:
public class OperationDiv extends Operation { public double getResult() { double result = 0; if (numberB == 0) { try { throw new Exception("除数不能为0"); } catch (Exception e) { e.printStackTrace(); } } else { result = numberA / numberB; } return result; } }