模板设计模式

article/2025/11/6 1:15:10

模板设计模式—基于抽象类的,核心是封装算法

  • 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现
  • 模板(模板方法)模式(Servlet、AQS)
    • 在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。
    • 模板模式使得子类可以在不改变算法结构的基础上,重新具体定义算法中的某些步骤

讲模板设计模式之前,我们用代码来实现咖啡和茶制作的类:

class Coffee {    /*   * 咖啡冲泡法(算法)     */    void prepareRecipe() {        boilWater();        brewCoffeeGrings();        pourInCup();        addSugarAndMilk();    }       public void boilWater() {        System.out.println("将水煮沸");    } public void brewCoffeeGrings() {        System.out.println("冲泡咖啡");    }  public void pourInCup() {        System.out.println("把咖啡倒进杯子中");    }public void addSugarAndMilk() {        System.out.println("加糖和牛奶");    } 
}class Tea {    /*   * 冲泡茶法(算法)     */    void prepareRecipe() {        boilWater();        steepTeaBag();        pourInCup();        addLemon();    }       public void boilWater() {        System.out.println("将水煮沸");    } public void steepTeaBag() {        System.out.println("浸泡茶叶");    }  public void pourInCup() {        System.out.println("把茶倒进杯子中");    }public void addLemon() {        System.out.println("加柠檬");    } 
}
class Test {public static void main(String[] agrs) {Coffee coffee = new Coffee();Tea tea = new Tea();coffee.prepareRecipe();tea.prepareRecipe();}
}

在这里插入图片描述

我们在这两个类中发现了重复代码,因此我们需要重新理一下我们的设计。

  • 既然茶和咖啡是如此的相似,因此我们应该将共同的部分抽取出来,放进一个基类中。
  • 从冲泡法入手。观察咖啡和茶的冲泡法我们会发现,两种冲泡法都采用了相同的算法:
    • 将水煮沸
    • 用热水泡饮料
    • 把饮料倒进杯子
    • 在饮料内加入适当的调料

实际上,浸泡(steep)和冲泡(brew)差异并不大。因此我们给它一个新的方法名称brew(),这样我们无论冲泡的是何种饮 料都可以使用这个方法。同样的,加糖、牛奶还是柠檬也很相似,都是在饮料中加入其它调料,因此我们也给它一 个通用名称addCondiments()。

/** * 咖啡因饮料是一个抽象类 
**/ 
abstract class CaffeineBeverage {    /*** 现在用同一个prepareRecipe()方法处理茶和咖啡。     * 声明为final的原因是我们不希望子类覆盖这个方法!     **/    final void prepareRecipe() {        boilWater();        brew();        pourInCup();        addCondiments();   }/**     * 咖啡和茶处理这些方法不同,因此这两个方法必须被声明为抽象,留给子类实现     **/    abstract void brew();    abstract void addCondiments();void boilWater() {        System.out.println("将水煮沸");    }void pourInCup() {        System.out.println("把饮料倒进杯子中");    } 
}class Coffee extends CaffeineBeverage {     public void brew() {        System.out.println("冲泡咖啡");    }  public void addCondiments() {        System.out.println("加糖和牛奶");    } 
}class Tea extends CaffeineBeverage {    public void brew() {        System.out.println("浸泡茶叶");    }  public void addCondiments() {        System.out.println("加柠檬");    } 
}
class Test {public static void main(String[] agrs) {CaffeineBeverage coffee = new Coffee();CaffeineBeverage tea = new Tea();coffee.prepareRecipe();tea.prepareRecipe();}
}

模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供具体实现

在模板设计模式下还有一种钩子用法

钩子方法是一类"默认不做事的方法" ,子类可以视情况决定要不要覆盖它们。
比如说,顾客点杯咖啡时,可以选择加不加牛奶或者糖!!!

import java.util.Scanner;/** * 咖啡因饮料是一个抽象类 
**/ 
abstract class CaffeineBeverage {    /*** 现在用同一个prepareRecipe()方法处理茶和咖啡。     * 声明为final的原因是我们不希望子类覆盖这个方法!     **/    final void prepareRecipe() {        boilWater();        brew();        pourInCup();   if(customerWantsCondiments())     addCondiments();   }/**     * 咖啡和茶处理这些方法不同,因此这两个方法必须被声明为抽象,留给子类实现     **/    abstract void brew();    abstract void addCondiments();void boilWater() {        System.out.println("将水煮沸");    }void pourInCup() {        System.out.println("把饮料倒进杯子中");    } boolean customerWantsCondiments() {return true;}
}class Coffee extends CaffeineBeverage {     public void brew() {        System.out.println("冲泡咖啡");    }  public void addCondiments() {        System.out.println("加糖和牛奶");    } /**  * 子类覆写了钩子函数,实现自定义功能   **/ boolean customerWantsCondiments() {String result = getUserInput();if(result.equals("y"))return true;elsereturn false;}    private String getUserInput() {System.out.println("您想要在咖啡中加入牛奶或糖吗(y/n)?");Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();return str;}
}class Tea extends CaffeineBeverage {    public void brew() {        System.out.println("浸泡茶叶");    }  public void addCondiments() {        System.out.println("加柠檬");    } 
}
class Test {public static void main(String[] agrs) {CaffeineBeverage coffee = new Coffee();CaffeineBeverage tea = new Tea();coffee.prepareRecipe();tea.prepareRecipe();}
}

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


http://chatgpt.dhexx.cn/article/oyCwfMAa.shtml

相关文章

资深码农教你写详细设计(附示例模板)

很多小伙伴都不知道怎么写详细设计,本期就带大家看一下详细设计都有哪些内容。 喜欢听我叨叨的,直接看视频 资深码农教你写详细设计(附模板) 不同的公司,详细设计不太一样,有的细,有的粗&#x…

【零基础深度学习教程第二课:深度学习进阶之神经网络的训练】

深度学习进阶之神经网络的训练 神经网络训练优化一、数据集1.1 数据集分类1.2 数据集的划分1.3 同源数据集的重要性1.4 无测试集的情况 二、偏差与方差2.1 概念定义2.1.1 偏差(bias)2.1.2 方差(variance) 2.2 图形定义2.3 衡量偏差…

深度学习小白入门教程-基础运用篇

深度学习小白入门教程-基础运用篇 可能有图片没部署成功,如果有影响,请回小主主页PyCharm玩个文本类数据二分类第一步,把我们可能用到的包安排上,还有python的标准主函数~第二步,导入数据集,cv大法就好啦~第…

深度学习(一、入门)

从人工智能开始 让机器具有人类的智能,能够理解人类语言、语音、图片、视频以及各种人类活动数据,并以此为依托辅助甚至代替人类做出决策,是人工智能的终极目标。最早提到机器智能的是图灵,1950年,他提出机器是否拥有…

深度学习如何入门?

beanfrog ,computer vision 161 人赞同 先了解个大概 A Deep Learning Tutorial: From Perceptrons to Algorithms 神经网络肯定是要学习的,主要是BP算法,可以看看PRML3、4、5三章,可先忽略其中的贝叶斯视角的解释。一些主要的算…

深度学习实战之Python教程(1)

Python入门教程 以熟练使用Pytorch完成深度学习模型为目标,简单介绍Pytorch涉及到的Python基础(Python其它知识可以在遇到后再学习,先动手)。 这篇教程并不涉及Python的复杂方法,教程的结构如下: 1…

深度学习教程(3) | 浅层神经网络(吴恩达·完整版)

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35本文地址:https://www.showmeai.tech/article-detail/214声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 本系列为吴…

《深度学习入门》(一)

感知机(perceptron) 感知机是由美国学者Frank Rosenblatt在1957年提出的。 学习原因:作为神经网络(深度学习)的起源算法。学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。 1. 感知机是什么 感知机…

深度学习基础学习

CNN发展:BP--LeNet(标志CNN面世)--Deep learning(2012) 卷积神经网络CNN:包含卷积层的神经网络 利用BP(反向传播)算法训练LeNet5网络 检索、目标检测、图像分割、图像描述 全连接层:神经元全连接 BP算法…

【深度学习基础】

最终效果如上图所示:真不知道这一路有多艰难 众所周知CHATGPT 可以做表格和 公式 ,但它输出的文本是直接渲染好的 你是直接复制不了的,你只能复制它出来的字体 于是我尝试了各种 想让它输出表格和文字的方法 包括且不限于 去控制台看它输出…

深度学习教程(2) | 神经网络基础(吴恩达·完整版)

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35本文地址:https://www.showmeai.tech/article-detail/213声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 本系列为吴…

深度学习教程(4) | 深层神经网络(吴恩达·完整版)

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35本文地址:https://www.showmeai.tech/article-detail/215声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 本系列为吴…

在服务器上进行深度学习的入门教程

1.远程登录 Windows用户推荐使用Xshell 主机那里填上服务器IP,下面填一下端口号,然后点击连接,之后会让你输入用户名密码,输入之后就可以进入啦 2.GPU状态 进入之后可能大家最想关注的就是GPU占用情况,可以使用一下两…

深度学习基础入门

课程简介 本课程共分为三个部分:基础理论、深度神经网络基本结构以及网络优化与实践。本课程采用了理论结合实践的讲解方式,方便读者边学边练,理解巩固。在解释相关概念时,作者尽力使用简单、直观、可实现的公式语言描述,尽量避免使用图形、比喻和白话等容易使初学者误入…

深度学习教程(5) | 深度学习的实用层面(吴恩达·完整版)

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35本文地址:https://www.showmeai.tech/article-detail/216声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 本系列为吴…

深度学习教程 | 吴恩达专项课程 · 全套笔记解读

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 引言 本篇内容是ShowMeAI组织的「深度学习教程 | 吴恩达专项课程 全套笔记解…

深度学习教程(1) | 深度学习概论(吴恩达·完整版)

作者:韩信子ShowMeAI教程地址:https://www.showmeai.tech/tutorials/35本文地址:https://www.showmeai.tech/article-detail/212声明:版权所有,转载请联系平台与作者并注明出处收藏ShowMeAI查看更多精彩内容 本系列为吴…

【零基础深度学习教程第一课:深度学习基础】

深度学习基础 目录 *深度学习基础*《第一节 深度学习简介》一、深度学习与机器学习区别二、神经网络简介2.1 单神经元网络2.2 多神经元网络 《第二节 神经网络基础》一、数据矩阵化1.1 惯例符号1.2 表示方法 二、激活函数与损失函数2.1 激活函数2.2 损失函数2.2.1 损失函数的定…

深度学习基础快速入门

目录 一、前言 二、MRI成像方向相关 三、相关技术文档 四、环境搭建相关 五、深度学习常用的函数 5.1numpy的使用 numpy.ones numpy.transpose numpy.delete 5.2matplot散点图绘制 5.3torch的使用 六,深度学习知识方面 6.1梯度 6.2loss函数 七、卷积神…

【深度学习基础】《深度学习》李宏毅

目录 Lecture I: Introduction of Deep Learning 1. 深度学习的步骤 2. 全连接前馈神经网络(Fully Connect Feedforward Network) 2.1 神经元 2.2. 激励函数 2.3 Softmax layer 2.4 网络结构 2.5 应用举例(数字识别) 3. …