首页 > 其他分享 >23种设计模式——模板模式

23种设计模式——模板模式

时间:2023-12-17 16:31:34浏览次数:29  
标签:23 子类 void System println 设计模式 模板 out

今天我们来学习23种设计模式中的模板模式。模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。

概念:

模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

特点:

优点:

  1. 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  2. 它在父类中提取了公共的部分代码,便于代码复用。
  3. 部分方法是由子类实现的,因此子类可以通过扩展方法增加相应的功能,符合开闭原则。

缺点:

  1. 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  2. 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
类图分析:

image.png

代码:

抽象类,豆浆

package cn.ppdxzz.template;

/**
 * description:抽象类,豆浆
 */
public abstract class BaseSoyMilk {
    /**
     * 模板方法,修饰符设置成 final,不允许子类覆盖
     */
    final void make() {
        select();
        addCondiments();
        soak();
        beat();
    }

    /**
     * 1. 挑选材料
     */
    void select() {
        System.out.println("第一步:挑选新鲜的食材黄豆...");
    }

    /**
     * 2. 抽象方法,添加不同的食材,子类具体实现
     */
    abstract void addCondiments();

    /**
     * 3. 浸泡食材
     */
    void soak() {
        System.out.println("第三步:黄豆和配料开始浸泡...");
    }

    /**
     * 4. 打碎食材
     */
    void beat() {
        System.out.println("第四步:黄豆和配料放豆浆机里打碎。");
    }
}

红豆牛奶

package cn.ppdxzz.template;

/**
 * description:红豆牛奶
 */
public class RedBeanSoyMilk extends BaseSoyMilk {
    @Override
    void addCondiments() {
        System.out.println("第二步:加入红豆...");
    }
}

花生牛奶

package cn.ppdxzz.template;

/**
 * description:花生牛奶
 */
public class PeanutSoyMilk extends BaseSoyMilk {
    @Override
    void addCondiments() {
        System.out.println("第二步:加入花生...");
    }
}

模板模式客户端

package cn.ppdxzz.template;

/**
 * description:模板模式客户端
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("---制作红豆豆浆---");
        BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        redBeanSoyMilk.make();
        System.out.println("---制作花生豆浆---");
        BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();
    }
}

运行结果:

image.png

总结:
  1. 有多个子类共有的方法,且逻辑相同时,可以考虑使用模板模式。
  2. 重要的、复杂的方法,可以考虑作为模板方法。
  3. 为防止恶意操作,一般模板方法都加上 final 关键词。

Spring 的 IoC 容器在初始化时就是用到了模板模式,需要深入了解的同学可以剖析下源码,自己研究一下。

标签:23,子类,void,System,println,设计模式,模板,out
From: https://blog.51cto.com/u_16167640/8862323

相关文章

  • 2023-2024-1 20232315 《网络空间安全导论》第六周学习总结
    一、教材学习内容总结近一周我预习了第六章应用安全基础,了解了相关知识,下面本章思维导图: 二、教材学习中的问题和解决过程问题一:虚拟化主要有哪些方式解决方法:百度搜索总结答案:虚拟化有很多实现方式,比如:根据虚拟化的程度和级别,有软件虚拟化和硬件虚拟化,全虚拟化和半虚拟......
  • 2023-2024-1 20232322罗上林 《网络》第六周学习总结
    教材学习内容总结教材学习中的问题和解决过问题一:不理解半虚化的含义问题一解决方案:询问百度得知半虚拟化和全虚拟化的区别是什么?二者一字之差,但是实质却大不相同。两者不同点在于通过是否改变操作系统内核设置,目的都是为了实现虚拟化。一般Xen虚拟机包含了完全虚拟化(fullvir......
  • 2023最新中级难度CSS面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度CSS面试题合集问:描述一下CSS的作用和重要性。CSS(CascadingStyleSheets)是一种用于定义网页元素外观和表现的样式表语言,它对于网页设计至关重要。CSS的主要作用有以下几点:样式控制:通过CSS,开发者可以为网页上的文本、图像和其......
  • 2023-2024-1 20231417 《计算机基础与程序设计》第十二周学习总结
    2023-2024-120231417《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业这个作业的目标《C语言程序设计》第11章作业正文 https://www.......
  • 2023-2024-1 20231403 《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业)这个作业的目标自学《C语言程序设计》第11章作业正文https://www.cnblogs.com/lsrmy/p/17908985.html教材学......
  • 【洛谷 P1923】【深基9.例4】求第 k 小的数(快速排序)
    【深基9.例4】求第k小的数题目描述输入(且为奇数)个数字(),输出这些数字的第小的数。最小的数是第小。请尽量不要使用nth_element来写本题,因为本题的重点在于练习分治算法。输入格式输出格式样例#1样例输入#15143215样例输出#12思路先快速排序,然后通过数组索引访......
  • 实验6-模板类、文件I/O和异常处理
    Vector.hpp1#ifndefVECTOR_HPP2#defineVECTOR_HPP34#include<iostream>5#include<stdexcept>67template<classT>8classVector{9private:10T*arr;11intsize;1213public:14Vector():arr(nu......
  • DOCKER20231217: 容器引擎Docker
       1.1Docker简介 1.1.1什么是Docker?一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现DockerInc)Docker容器化虚拟技术vs传统虚拟机技术特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为G......
  • 2023-2024-1 20231310《计算机基础与程序设计》第12周学习总结
    作业信息作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求>(2022-2023-1计算机基础与程序设计第一周作业)作业目标《C语言程序设计》第11章作业正文https://www.cnblogs.com/wang-hoNbang/p/17908886.html教材学习内容总结《C......
  • 2023-12-16 每天一练
    LeetCode每日一题2276.统计区间中的整数数目题目给你区间的空集,请你设计并实现满足要求的数据结构:新增:添加一个区间到这个区间集合中。统计:计算出现在至少一个区间中的整数个数。实现CountIntervals类:CountIntervals()使用区间的空集初始化对象voidadd(intl......