【设计模式】实战篇

目录标题

【实战一】模板方法模式

抽象类

定义一个抽象类:FarmWorkNodeRecord:表示其记录是用来操作计划的节点对象的。

java 复制代码
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实现:

java 复制代码
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实现:

java 复制代码
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;
    }
}

此时,对于模板方法也就完毕了。测试看看:

bash 复制代码
1. farmWorkRecordBootStageMapper	插入当前记录
2. farmWorkRecordBootStageLandMapper	插入土地
3. plantPlanRuleInfoService	仅延迟种植计划当前的节点规则
4. plantPlanRuleDifferenceThresholdService	【BootStage】更新规则差值表
5. plantPlanRuleInfoService	【BootStage】更新节点操作状态

1. farmWorkSprayStageMapper	插入当前记录
2. farmWorkRecordSprayStageLandMapper	插入土地
3. plantPlanInfoService	延迟种植计划当前节点以及后序的节点规则
4. plantPlanRuleDifferenceThresholdService	【SprayStage】更新规则差值表
5. plantPlanRuleInfoService	【SprayStage】更新节点操作状态

❓但是,此时我们还没有解决我们在前面框住的代码。我们还需要解决如下的场景:

我是觉得简易工厂模式比较符合。

目前还没有想好说服自己到底用哪一个。

咕咕咕。另外我还剩下两个模式没有看完。忙得很啊。

估计会先把书看完,之后再来把这个遗留问题解决。

相关推荐
找不到、了7 分钟前
分布式理论:CAP、Base理论
java·分布式
天天摸鱼的java工程师10 分钟前
2025已过半,Java就业大环境究竟咋样了?
java·后端
人生在勤,不索何获-白大侠14 分钟前
day16——Java集合进阶(Collection、List、Set)
java·开发语言
Zedthm21 分钟前
LeetCode1004. 最大连续1的个数 III
java·算法·leetcode
艺杯羹32 分钟前
MyBatis之核心对象与工作流程及SqlSession操作
java·mybatis
神的孩子都在歌唱40 分钟前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
喜欢吃豆1 小时前
深入企业内部的MCP知识(三):FastMCP工具转换(Tool Transformation)全解析:从适配到增强的工具进化指南
java·前端·人工智能·大模型·github·mcp
用户1551733938831 小时前
前后端处理 `multipart/form-data` 混合参数(实体对象+文件)方案
java
东阳马生架构1 小时前
订单初版—3.支付和履约链路中的技术问题说明文档
java
留不住丨晚霞2 小时前
说说SpringBoot常用的注解?
java·开发语言