前言
代码例子是来大话设计模式,本文主要是根据个人的理解,对书中的内容做学习笔记。
基础遗忘了可以复习一下:
面向对象Java基础
简单了解UML类图
1、业务背景
做一个计算器
2、UML与代码
这里不在复述书中的提炼过程,直接讲模式,UML和代码。
2.1 封装业务
我们需要加减乘除四种运算,然后又能知道,他们唯一的区别是符号不同【提炼业务逻辑的相同部分】,为了避免高耦合,我们对每种运算做封装。
- 记录:
继承是自底向上抽象出来的,我们应该
1.想加减乘除的业务方法并提炼,得到Operation类的方法
2.根据Operation的方法,封装各个业务逻辑类,并继承Operation
运算类:
public abstract class Operation {
public double getResult(double numberA, double numberB){
return 0d;
}
}
加减乘除类:
public class Add extends Operation{
public double getResult(double numberA, double numberB){
return numberA + numberB;
}
}
public class Sub extends Operation{
public double getResult(double numberA, double numberB){
return numberA - numberB;
}
}
public class Mul extends Operation{
public double getResult(double numberA, double numberB){
return numberA * numberB;
}
}
public class Div extends Operation{
public double getResult(double numberA, double numberB){
return numberA / numberB;
}
}
2.2 简单工厂模式实现
考虑一个问题:到底要实例化谁,将来会不会增加实例化对象。
例如增加指数运算,这就是容易变化的地方,应该用一个单独的类来做这个创造实例的过程,这就是工厂
简单运算工厂类:
public class OperationFactory {
public static Operation createOperation(String operate){
Operation oper = null;
switch (operate) {
case "+":
oper = new Add();
break;
case "-":
oper = new Sub();
break;
case "*":
oper = new Mul();
break;
case "/":
oper = new Div();
break;
}
return oper;
}
}
客户端代码:
double nemberA = Double.parseDouble(sc.nextLine());
String strOperate = sc.nextLine();
double nemberB = Double.parseDouble(sc.nextLine());
// 主程序访问的入口
Operation oper = OperationFactory.createOperate(strOperate);
double result = oper.getResult(numberA,numberB);
如果需要改动业务,客户端代码不用改变,只需要改OperationFactory里面,对于某一业务也可以针对性的改,不会对其他部分造成影响。
3、总结
- 该模式只解决对象创建的问题(工厂创建对象)
- 工厂类是把要用的子类,在工厂类中根据情况new好