津津乐道设计模式 - 模版模式详解(以女友化妆流程带你彻底明白)

news2024/10/6 18:20:47

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 模版模式详解

  • 什么是模版模式
  • 模版模式的应用场景
  • 生活案例
  • 案例代码
  • 结语

什么是模版模式

模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤

模版模式的应用场景

  • 算法的骨架固定:当一个算法的骨架固定不变,但是其中某些步骤的具体实现可能会有所不同,可以使用模板模式。模板模式定义了算法的骨架,而具体的步骤可以由子类来实现,从而实现算法的定制化。

  • 避免代码重复:如果有多个类拥有相似的行为,但其中某些步骤的实现可能有差异,可以使用模板模式来避免代码的重复。将相同的步骤放在模板类中,而将不同的实现放在具体的子类中,可以减少重复的代码,提高代码的复用性。

  • 需要在不破坏封装的情况下扩展算法:模板模式可以在不破坏原有算法封装的情况下,通过子类重写特定的步骤来扩展算法的功能。这样可以保持算法的稳定性,并且使得扩展变得更加灵活和可控。

  • 控制算法的执行流程:通过模板模式,可以在算法中定义执行的顺序和条件,确保每个步骤都按照特定的顺序执行,并且可以通过在模板方法中加入钩子方法来控制算法的执行流程。

比如我们开发中常见的:

框架和库的设计:很多框架和库使用模板模式来定义一些核心的算法或流程,然后允许开发者根据需要进行定制。

数据库访问:在数据库访问过程中,可以使用模板模式来定义一些通用的操作流程,比如连接数据库、执行查询、关闭连接等,而具体的SQL语句可以由子类来实现。

生活案例

细心的你或许发现了,你的女朋友每次化妆前都有她固有的一套流程:比如清洁、涂抹粉底、眼妆、腮红、口红等。每个化妆步骤的顺序是固定的,但是具体的产品和每一种妆容化妆技巧可能有所不同。

在这种情况下,你女朋友就是使用模板模式来帮助她更方便地完成化妆过程 😂 。

案例代码

上面女朋友化妆案例中,我们使用JAVA代码来给大家演示一下

首先,创建一个抽象类 MakeupTemplate,它定义了化妆的步骤:

/**
 * 化妆抽象类 定义了化妆的步骤
 */
public abstract class MakeupTemplate {
    public final void doMakeup() {
        washFace();
        applyFoundation();
        doEyeMakeup();
        doBlushMakeup();
        applyLipstick();
    }
    //洁面
    protected abstract void washFace();

    //涂抹粉底
    protected abstract void applyFoundation();

    //眼妆
    protected abstract void doEyeMakeup();

    //腮红
    protected abstract void doBlushMakeup();

    //口红
    protected abstract void applyLipstick();
}

然后,创建具体的化妆类,继承 MakeupTemplate 并实现特定的步骤:

自然淡雅妆

/**
 * 定义自然妆
 */
public class NaturalMakeup extends MakeupTemplate {
    @Override
    protected void washFace() {
        System.out.println("美白洗面奶清洁脸部");
    }

    @Override
    protected void applyFoundation() {
        System.out.println("涂抹轻薄的粉底");
    }

    @Override
    protected void doEyeMakeup() {
        System.out.println("涂抹淡雅的眼影和睫毛膏");
    }

    @Override
    protected void doBlushMakeup() {
        System.out.println("拍上淡粉的腮红");
    }

    @Override
    protected void applyLipstick() {
        System.out.println("涂抹自然色调的口红");
    }
}

魅力妖艳妆

/**
 * 定义魅力妖艳妆
 */
public class GlamorousMakeup extends MakeupTemplate {
    @Override
    protected void washFace() {
        System.out.println("补水洗面奶清洁脸部");
    }

    @Override
    protected void applyFoundation() {
        System.out.println("涂抹厚厚的粉底");
    }

    @Override
    protected void doEyeMakeup() {
        System.out.println("涂抹浓密的眼影和眼线");
    }

    @Override
    protected void doBlushMakeup() {
        System.out.println("拍上艳丽的腮红");
    }

    @Override
    protected void applyLipstick() {
        System.out.println("涂抹鲜艳的口红");
    }
}

在测试代码中,你可以根据女朋友的需求选择不同的化妆风格,而无需关心具体的步骤:

public class TemplatePatternTest {
    public static void main(String[] args) {
        MakeupTemplate naturalMakeup = new NaturalMakeup();
        System.out.println("女友开始画自然妆:");
        naturalMakeup.doMakeup();

        System.out.println("------------------------");

        System.out.println("女友开始画魅力妖艳妆:");
        MakeupTemplate glamorousMakeup = new GlamorousMakeup();
        glamorousMakeup.doMakeup();
    }
}

最后输出结果如下
在这里插入图片描述
你的女朋友通过模板模式可以根据不同的场合选择适合的化妆风格,而不需要关心每个步骤的具体实现。这样可以简化化妆的过程,并且保证每个步骤的顺序正确。

结语

本章内容带大家以实际生活场景 - 女友化妆流程;带大家深刻认识模板模式的使用方法。

总结就是模板模式在需要定义算法的骨架并允许具体步骤定制化的场景下非常有用。它提供了一种有效的方式来实现代码复用、增强扩展性,并能控制算法的执行流程。

样例代码:https://github.com/lhmyy521125/toher-designmode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC-->java如何连接数据库(详细版小白必备)

个人名片: 🐅作者简介:一名大二在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

工业相机——显微镜头/放大镜头

校准尺,最小测量刻度为0.1mm 上图为手机拍的看不清,放了一个网上找的图,校准的详细参数见下图 例如:物距为116mm的显微镜头,这种镜头没有景深,只能测镜头前端到物体116mm的物体 ,几乎没有景深&a…

Vscode配置C/C++环境出现报错,导致不能运行代码,报错如下:

Vscode配置C/C环境出现报错,导致不能运行代码,报错如下: 问题描述—gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次…

Hexo博客搭建 —— Next主题配置

Hexo博客搭建 —— Next主题配置 文章目录 Hexo博客搭建 —— Next主题配置配置文件区分站点配置文件主题配置文件 配置文件描述简称引入next主题-sitenext主题页面模式设置-next设置首页不显示全文-site设置博客文章持久化连接-site下载插件URL Setting 参考文档 配置文件区分…

【Docker】一文了解DockerFile

文章目录 Dockerfile 概念DockerFile的指令1、FROM 指定基础镜像2、RUN 执行命令3、COPY 复制文件4、ADD 更高级的复制文件5、ENV 设置环境变量6、EXPOSE7、VOLUME 定义匿名卷8、CMD容器启动命令9、ENTRYPOINT入口点10、USER 指定当前用户11、WORKDIR 指定工作目录12、LABEL为镜…

网络安全、Web安全、渗透测试之笔经面经总结含答案

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…

4、数据库操作语句:聚合函数

目录 1、定义 2、常用的聚合函数 1)Avg/sum:只适用于数值类型的字段(或变量)。 2)Max/min:适用于数值类型、字符串类型、日期时间类型的字段(或变量) 3)Count: ①作…

一起来学孟德尔随机化(Mendelian Randomization)

孟德尔随机化最近实在是太火了,想不关注都不行,最近也花了点时间研究了一下,和大家分享一下,共同学习。 什么是孟德尔随机化? 在19世纪,孟德尔用豌豆花作为实验材料,通过对豌豆花颜色、形状等特…

ESP-BOX的GUI移植

因为squareline studio软件中适配了ESP-BOX,所以作者本想直接使用该软件创建的工程,但是会出现花屏的现象,也不知道是不是没有做好esp-box-lite的适配。 因此只能先用squareline studio设计好GUI,然后再导出其代码,在其…

jmeter-13-使用JSR223断言(推荐)

文章目录 前言一、JSR 223 进行断言二、总结 前言 之前都在使用 BeanShell 前后置、断言等,但是查看官方文档时发现推荐使用 JSR223 其实 BeanShell 是 JSR223 里面的一种,下面我们继续了解下。 官网介绍:Apache JMeter - User’s Manual: C…

【数据分享】1929-2022年全球站点的逐月平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

ffmpeg+nginx-rtmp转发视频流

本篇博客最早发布于实验室公共博客,但已无人维护,现迁移至个人博客 nginx与nginx-rtmp-module安装 画了好几天图,实在有些乏力,找点有意思的事情做做 觉得视频流传输挺有意思,B站找了些视频,但感觉有些大…

【论文简述】IS-MVSNet:Importance Sampling-based MVSNet(ECCV 2022)

一、论文简述 1. 第一作者:Likang Wang 2. 发表年份:2022 3. 发表期刊:ECCV 4. 关键词:MVS、3D重建、重要性采样、无监督误差分布估计 5. 探索动机:以粗到细的方式预测深度图,部分缓解了对于分辨率的限…

Apache James邮件服务器搭建(linux)

1、配置jdk,此处不再赘述,随便搜一下然后照着操作即可 注意:后续james的版本是3.5.0,需要与jdk8配套 2、下载apache james ,apacheJames 下载之后可以直接运行,无需安装 注意:此处选择3.5.0版…

人工智能数据集处理——数据清理1

目录 一、概述 二、缺失值 1、检测缺失值 使用isna() 方法检测na_df中是否存在缺失值 使用natna() 方法 2、缺失值的处理 (1) 删除缺失值 使用删除dropna() 方法删除na_df 对象中缺失值所在的一行数据 删除全为缺失值的行 删除有缺失值的行 (2) 填充缺失值 使用fill…

win10 下搭建hadoop(成功截图)

背景: 搭建hadoop是大数据的启蒙第一步,对初学者有很好的信心建设,建议安装版本和作者一样。话不多说,开始正文。 1. 下载hadoop 本文版本为3.0.0 可以Apache.org官网下载,也可以本人csdn资源处下载https://download.…

数据结构之静态链表

定义 用两个数组实现链表,一个数组存储数据,另一个数组记录当前数据的后继的下标。 示例 数据:data[] {-1, 34, 28, 53, 16, 25, -1, -1, -1, -1} 后继:next[] { 1, 2, 3, 4, 5, -1, -1, -1, -1, -1} 说明 -1: 表示无效值 …

Linux2.基础指令(下)

1.uname -r :输出Linux内核版本信息。 2.linux2.6.*内核默认支持的文件系统有ext3,ext2,ext4,xfs,不支持ufs。 3.linux查看CPU占用的命令:top。 4.题目 5.题目 6.题目 7.重定向 echo "字符串1" :在屏幕上打印字符串1。 echo "字符串1" &g…

C语言督学营(初级阶段)

文章目录 初级阶段1.编程环境搭建、调试C的历史故事写代码快速提升的方法快捷键编程环境 Clion、断点调试(单步调试) 2.数据类型、标准输入输出数据分类printf整型进制转换内存视图ASCII码表计算器 scanf的原理 3.运算符与表达式C语言的13种运算符运算符优先级 4.选择、循环1.选…

【每日算法 数据结构(C++)】—— 01 | 平方值去重统计(解题思路STL法,双指针法、流程图、代码片段)

文章目录 01 | 👑 题目描述02 | 🔋 解题思路STL法双指针法 03 | 🧢 代码片段STL法双指针法 “Success is not final, failure is not fatal: It is the courage to continue that counts.” - Winston Churchill (成功并非终点&am…