当前位置: 首页 > news >正文

java设计模式-模板方法模式

模板方法模式

  • 编写制作豆浆的程序,说明如下
    1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎
    2)通过添加不同的配料,可以制作出不同口味的豆浆
    3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
    4)请使用模板方法模式完成 说明: 因为模板方法模式,比较简单, 很容易就想到这个方案 ,因此就直接使用,不再使用传统的方案来引出模板方法模式

原理图
在这里插入图片描述

1、AbstractClass抽象类,类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现,其他的抽象类方法operation2,3,4
2、ConcreteClass实现抽象方法operation2,3,4已完成算法中特定子类的步骤

@Slf4j
public abstract class SoyaMilk {
    //模板方法 make 模板方法可以做成final,不让子类去覆盖
    final void make() {
        select();
        addCondiments();
        soak();
        beat();
    }
    //选择材料
    void select() {
        log.info("第一步:选择好的新鲜黄豆");
    }
    //添加不同的配料,抽象方法,子类具体实现。
    abstract void addCondiments();
    //浸泡
    void soak() {
        log.info("第三步:黄豆和配料开始浸泡,需要3小时");
    }
    //打浆
    void beat() {
        log.info("第四步:黄豆和配料放到豆浆机中去打碎。");
    }
}
@Slf4j
public class PeanutSoyaMilk extends  SoyaMilk{
    @Override
    void addCondiments() {
        log.info("第二步:加入花生");
    }
}
@Slf4j
public class RedBeanSoyaMilk extends  SoyaMilk{
    @Override
    void addCondiments() {
        log.info("第二步:加入红豆");
    }
}
@Slf4j
public class Client {
    public static void main(String[] args) {
        log.info("------制作红豆豆浆------");
        RedBeanSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();
        log.info("=====================================");
        log.info("------制作花生豆浆------");
        PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();

    }
}
------制作红豆豆浆------
- 第一步:选择好的新鲜黄豆
- 第二步:加入红豆
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。
=====================================
------制作花生豆浆------
- 第一步:选择好的新鲜黄豆
- 第二步:加入花生
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。

钩子方法

在模板方法模式的父类中,我们可以定义一个方法,不做任何事,子类可以去视为情况要不要覆盖它,称之为钩子程序。

@Slf4j
public abstract class SoyaMilk {
    //模板方法 make 模板方法可以做成final,不让子类去覆盖
    final void make() {
        select();
        if (customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }
    //......
    //钩子方法,决定是否需要添加配料
    boolean customerWantCondiments() {
        return true;
    }
}
@Slf4j
public class PureSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        //空实现
    }
    @Override
    boolean customerWantCondiments() {
        return false;
    }
}
@Slf4j
public class Client {
    public static void main(String[] args) {
        log.info("=====================================");
        log.info("------制作纯豆浆------");
        SoyaMilk pureSoyaMilk = new PureSoyaMilk();
        pureSoyaMilk.make();

    }
}
=====================================
------制作纯豆浆------
- 第一步:选择好的新鲜黄豆
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。
  • 模板方法在源码中的应用(spring IOC源码分析)
    在这里插入图片描述
    在这里插入图片描述

模板方法的注意事项和细节

1、基本的思想是:算法只存在于一个地方,也就是在父类中容易修改。,
需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
2、实现了最大化代码复用,父类的模板方法和已经实现的某些步骤被直接的继承而直接使用。
3、即同意了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时有子类提供部分步骤的实现。
4、该模式的不足之处:每一个不同的实现都需要一个子类实现,刀之类的个数增加,是的系统更加庞大。
5、一般末班方法都加上final关键字。发囊之子类重写模板方法。
6、模板方法模式使用场景。当要完成某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同
但是个别步骤在实现时有可能不同,通常考虑用模板方法模式来处理。

相关文章:

  • 【JavaSE】异常
  • OSPF基础入门篇②:OSPF邻居建立篇-网络设备的“社交礼仪“
  • Android里蓝牙使用流程以及问题详解
  • 深度强化学习基础 0:通用学习方法
  • 架构演进成熟度校验体系构建
  • MyBatis批量更新之CASE WHEN方式详解
  • 找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索
  • React + TipTap 富文本编辑器 实现消息列表展示,类似Slack,Deepseek等对话框功能
  • 基于二叉堆实现的 PriorityQueue
  • LLM应用实战2-理解Tokens
  • C语言malloc类函数详解
  • Linux C 与 C 语言的区别及开发差异
  • Spring MVC 请求类型注解详解
  • Java-多级排序结合thenComparing()
  • 四六级听力考试播音系统:构建播放控制智能化、发射系统双备份、发射功率有冗余、安全稳定可靠的英语四六级听力播音系统使用环境
  • vue-element-plus-admin的安装
  • pytorch小记(十六):PyTorch中的`nn.Identity()`详解:灵活模型设计的秘密武器
  • Linux内核——X86分页机制
  • I/O进程4
  • 动态规划系列一>卡特兰数-不同的二叉搜索树
  • 黄州做网站的/2021十大网络舆情案例
  • 亳州市网站建设/谷歌搜索引擎
  • 上海优化网站 优帮云/网站关键词优化排名软件系统
  • dreamweaver的优点/抖音seo排名软件哪个好
  • 晋城做网站的公司/东莞哪种网站推广好
  • 企业网站设计注意事项/适合企业员工培训的课程