目录标题
- 【实战一】模板方法模式
- 抽象类
- 子类
【实战一】模板方法模式
抽象类
定义一个抽象类:FarmWorkNodeRecord
:表示其记录是用来操作计划的节点对象的。
public abstract class FarmWorkNodeRecordService {
// 模拟Mapper
private 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{
// 模拟Mapper
private String farmWorkRecordBootStageMapper = "farmWorkRecordBootStageMapper";
private String farmWorkRecordBootStageLandMapper = "farmWorkRecordBootStageLandMapper";
@Override
void insertFarmWorkNodeRecord() {
System.out.println("1. "+ farmWorkRecordBootStageMapper +"\t插入当前记录");
}
@Override
void insertBatchLand() {
System.out.println("2. "+ farmWorkRecordBootStageLandMapper +"\t插入土地");
}
}
子类SprayStage实现:
public class FarmWorkNodeRecordSprayStageServiceImpl extends FarmWorkNodeRecordService{
// 模拟代替Mapper
private String farmWorkSprayStageMapper = "farmWorkSprayStageMapper";
private String farmWorkRecordSprayStageLandMapper = "farmWorkRecordSprayStageLandMapper";
@Override
void insertFarmWorkNodeRecord() {
System.out.println("1. "+ farmWorkSprayStageMapper +"\t插入当前记录");
}
@Override
void insertBatchLand() {
System.out.println("2. "+ farmWorkRecordSprayStageLandMapper +"\t插入土地");
}
/**
* 重写钩子函数
* @return
*/
@Override
boolean 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】更新节点操作状态
❓但是,此时我们还没有解决我们在前面框住的代码。我们还需要解决如下的场景:
我是觉得简易工厂模式比较符合。
目前还没有想好说服自己到底用哪一个。
咕咕咕。另外我还剩下两个模式没有看完。忙得很啊。
估计会先把书看完,之后再来把这个遗留问题解决。