目录标题
- 【实战一】模板方法模式
- 抽象类
- 子类
【实战一】模板方法模式
抽象类
定义一个抽象类:FarmWorkNodeRecord
:表示其记录是用来操作计划的节点对象的。
public abstract class FarmWorkNodeRecordService {// 模拟Mapperprivate String plantPlanRuleDifferenceThresholdService = "plantPlanRuleDifferenceThresholdService";private String plantPlanRuleInfoService = "plantPlanRuleInfoService";private String plantPlanInfoService = "plantPlanInfoService";/*** 模板方法*/final void insertFarmWorkNodeRecordVo(String type){// 1. 插入当前记录insertFarmWorkNodeRecord();// 2. 插入土地insertBatchLand();// 3. 更新种植计划规则updatePlantPlanRule();// 4. 更新规则差值表calculatePlantPlanRuleDifferenceThreshold(type);// 5. 计划节点操作状态更新updateIfAccomplishNodeFarming(type);}/*** 插入当前记录*/abstract void insertFarmWorkNodeRecord();/*** 插入土地*/abstract void insertBatchLand();/*** 仅延迟种植计划当前的节点规则*/void updateSelf(){System.out.println("3. "+ plantPlanRuleInfoService +"\t仅延迟种植计划当前的节点规则");}/*** 延迟种植计划当前节点以及后序的节点规则*/void updateSelfAndChild(){System.out.println("3. "+ plantPlanInfoService +"\t延迟种植计划当前节点以及后序的节点规则");}/*** 更新规则差值表*/void calculatePlantPlanRuleDifferenceThreshold(String nodeType){System.out.println("4. " + plantPlanRuleDifferenceThresholdService +"\t【" + nodeType + "】更新规则差值表");}/*** 计划节点操作状态更新: 父、 子*/void updateIfAccomplishNodeFarming(String nodeType){System.out.println("5. " + plantPlanRuleInfoService +"\t【" + nodeType + "】更新节点操作状态");}/*** 是否种植计划只延迟当前的结点规则* @return true更新当前; false 延迟当前以及*/boolean isOnlyUpdateSelf() {return true;}/*** 更新种植计划规则** <p>updateSelfAndChild* <ul>* <li> 延迟种植计划当前节点以及后序的节点规则:*</ul>* <p>updateSelf* <ul>* <li> 仅延迟种植计划当前的节点规则*</ul>**/final void updatePlantPlanRule(){if (isOnlyUpdateSelf()){updateSelf();}else {updateSelfAndChild();}}}
下面解释一下,对这个抽象类类进行优化的思想:
「首先,先对业务操作高度抽象化,转化为模板方法」
我们先把 上图 「待优化的代码 - 模板方法模式」框住的代码高度抽象化,变为步骤3
「接下来,对模板方法的步骤进行分析」
- 重复的代码,放到超类里面,统一进行管理
- 普通方法
- final 方法
- 不重复的代码,交给子类进行重写
- 抽象方法
「最后,通过钩子函数来决定到底调用哪个方法」
通过钩子函数:isOnlyUpdateSelf
来决定 步骤3updatePlantPlanRule
实际调用:updateSelf
或者 updateSelfAndChild
子类
子类BootStage实现:
public class FarmWorkNodeRecordBootStageServiceImpl extends FarmWorkNodeRecordService{// 模拟Mapperprivate String farmWorkRecordBootStageMapper = "farmWorkRecordBootStageMapper";private String farmWorkRecordBootStageLandMapper = "farmWorkRecordBootStageLandMapper";@Overridevoid insertFarmWorkNodeRecord() {System.out.println("1. "+ farmWorkRecordBootStageMapper +"\t插入当前记录");}@Overridevoid insertBatchLand() {System.out.println("2. "+ farmWorkRecordBootStageLandMapper +"\t插入土地");}}
子类SprayStage实现:
public class FarmWorkNodeRecordSprayStageServiceImpl extends FarmWorkNodeRecordService{// 模拟代替Mapperprivate String farmWorkSprayStageMapper = "farmWorkSprayStageMapper";private String farmWorkRecordSprayStageLandMapper = "farmWorkRecordSprayStageLandMapper";@Overridevoid insertFarmWorkNodeRecord() {System.out.println("1. "+ farmWorkSprayStageMapper +"\t插入当前记录");}@Overridevoid insertBatchLand() {System.out.println("2. "+ farmWorkRecordSprayStageLandMapper +"\t插入土地");}/*** 重写钩子函数* @return*/@Overrideboolean isOnlyUpdateSelf() {return false;}
}
此时,对于模板方法也就完毕了。测试看看:
1. farmWorkRecordBootStageMapper 插入当前记录
2. farmWorkRecordBootStageLandMapper 插入土地
3. plantPlanRuleInfoService 仅延迟种植计划当前的节点规则
4. plantPlanRuleDifferenceThresholdService 【BootStage】更新规则差值表
5. plantPlanRuleInfoService 【BootStage】更新节点操作状态1. farmWorkSprayStageMapper 插入当前记录
2. farmWorkRecordSprayStageLandMapper 插入土地
3. plantPlanInfoService 延迟种植计划当前节点以及后序的节点规则
4. plantPlanRuleDifferenceThresholdService 【SprayStage】更新规则差值表
5. plantPlanRuleInfoService 【SprayStage】更新节点操作状态
❓但是,此时我们还没有解决我们在前面框住的代码。我们还需要解决如下的场景:
我是觉得简易工厂模式比较符合。
目前还没有想好说服自己到底用哪一个。
咕咕咕。另外我还剩下两个模式没有看完。忙得很啊。
估计会先把书看完,之后再来把这个遗留问题解决。