Java设计模式 12-模版模式

news2024/9/22 17:34:20

模板模式

一、豆浆制作问题

编写制作豆浆的程序,说明如下:

1)制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎

2)通过添加不同的配料,可以制作出不同口味的豆浆

3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

4)请使用模板方法模式完成(说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用, 不再使用传统的方案来引出模板方法模式 )

二、模板方法模式基本介绍

基本介绍

1)模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),

在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

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

3)这种类型的设计模式属于行为型模式

三、模板方法模式原理类图

1、 模板方法模式的原理类图

image-20210702204604691

  • 对原理类图的说明-即(模板方法模式的角色及职责)
  1. AbstractClass 抽象类:

类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operationr2,3,4

  1. ConcreteClass 实现抽象方法 operationr2,3,4, 以完成算法中特点子类的步骤

四、模板方法模式解决豆浆制作问题

1)应用实例要求

编写制作豆浆的程序,说明如下:

制作豆浆的流程 选材—>添加配料(每个种类的配料材料不一样)—>浸泡—>放到豆浆机打碎通过添加不同的配料,可以制作出不同口味的豆浆

选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆…)

2)思路分析和图解(类图)

image-20210702210829214

3)代码实现

主函数

public class Client {
    public static void main(String[] args) {
        //制作红豆豆浆
        System.out.println("----制作红豆豆浆----");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk(); 
        redBeanSoyaMilk.make();

        System.out.println("---- 制 作 花 生 豆 浆 ----"); 
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk(); 
        peanutSoyaMilk.make();
    }
}

PeanutSoyaMilk

public class PeanutSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println(" 加入上好的花生 ");
    }
}

RedBeanSoyaMilk

public class RedBeanSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println(" 加入上好的红豆 ");
    }
}

SoyaMilk抽象类

//抽象类,表示豆浆
public abstract class SoyaMilk {
    //模板方法, make , 
    //模板方法可以做成 final , 不让子类去覆盖重写
    final void make() {
        select(); 
        addCondiments(); 
        soak();
        beat();
    }
    
    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆	");
    }
    
    //添加不同的配料, 抽象方法,  子类具体实现
    abstract void addCondiments();
    
    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要 3 小时 ");
    }

    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎	");
    }
}

五、模板方法模式的钩子方法

  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。

2)还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

  • 代码
//抽象类,表示豆浆
public abstract class SoyaMilk {
    //模板方法, make
    //模板方法可以做成 final , 不让子类去覆盖. 
    final void make() {
        select(); 
        if(customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }
    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆	");
    }
    //添加不同的配料, 抽象方法,  子类具体实现
    abstract void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要 3 小时 ");
    }

    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎	");
    }

    //钩子方法,决定是否需要添加配料 
    boolean customerWantCondiments() {
        return true;
    }
}

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

1)基本思想

算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

2)实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

3)既统一了算法,也提供了很大的灵活性

父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

4)该模式的不足之处:

每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

5)一般模板方法都加上final 关键字, 防止子类重写模板方法.

6)模板方法模式使用场景:

当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理

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

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

相关文章

关于使用SSM框架搭建的项目的运行方法

目录 运行环境配置 1、安装 IDEA 开发工具 中文版设置 JDK直接下载 2、安装 MYSQL 数据库 2.1 下载安装 2.2 配置环境变量 2.4 安装 MySQL 2.4 进入 MySQL 2.5 常见问题 3、安装Tomcat 4、IDEA配置MYSQL 4.1、常见错误 5、IDEA配置TOMCAT 5.1、常见报错 一 运行环…

2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程

文章目录 下载安装Golang配置 Golang 环境GO111MODULEGOPROXY开启 Go mod 模式及设置包下载国内镜像配置 Vscode Golang 环境 Bug 集锦The "gopls" command is not available.Run "go get -v golang.org/x/tools/gopls" to install. GO语言也称为Golang&am…

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&…

【ArcGIS教程】批量裁剪

ArcGIS教程:批量裁剪 1 裁剪1.1 准备:创建shp文件/选定区域、自由选区1.1 单一裁剪1.2 批量裁剪(Batch) 2 批量裁剪参考 1 裁剪 1.1 准备:创建shp文件/选定区域、自由选区 步骤1: 创建shp文件 打开ArcCat…

2023年了,来体验下前端的测试方案

在当前的前端当中,有好多同学自己写的代码bugger横飞,怎么解决这个问题呢🤔🤔🤔?个人觉得主要有以下两个趋势 给前端的代码加上类型检查(ts)给前端代码编写单元测试和e2e测试 当然&a…

【C++】继承和多态、共有私有和保护、重写

区分继承与多态、辨别public、protected、private 继承与多态的概念继承与多态的区别与联系区别:联系:示例结果: 继承和访问的权限说明示例:结果 结论 继承与多态的概念 面向对象三大原则:封装、继承、多态。继承是一种…

【C++进阶1--继承】面向对象三大特性之一(附菱形继承讲解

继承是面向对象中很重要的特性,今天就来讲讲C中的继承。 文中不足错漏之处望请斧正! 什么是继承? 是一种类的复用,可以让B类继承,从而使B类获得A类的所有成员。 A类叫做父类或基类,B类叫做子类或派生类。…

C++ 构造函数-2

构造函数-2 构造函数体赋值 在对象创建的时候,编译器会调用构造函数,给对象当中的成员赋一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; i…

Android framework工程师一定要知道的高级技巧

作为一名android framework工程师,你是否对Android framework的一些高阶使用技巧感到陌生?想了解更多的细节?如果是这样,那么就请你读下去。本篇文章我将为大家相信介绍Android framework的高阶技巧,帮助你成为一名高级…

【Nginx】【SSL】Nginx上配置ssl证书

配置需要有自己的域名和云主机;域名已经解析到主机;安装好Nginx 一、申请免费版的SSL证书 1、阿里云可以申请免费版的SSL证书 阿里云搜索 ssl 找到 数字证书管理服务/SSL 证书>免费证书;申请一个免费的 2、下载SSL证书到本地&#xf…

贝叶斯公式与全概率公式的理解。

1.贝叶斯与全概率公式解释 1.全概率公式定义 即若在某个场景下,可找到一个完备事件组 Ai ( i 1,2,3…n)。 则对任一与该场景有关的事件 B,都可以分割成无数个小事件(由不同因素引起的事件) 有:   B B ∩ A1 ∪ A2…

给你的项目启动提提速:Lazy Initialization

前言 在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不二之选。这个小镇上的人们每天都在用 Spring Boot 框架创造着令人瞩目的应用程序。 然而,随着时间的推移…

Java 学习之线程

1、引入线程的优点: 1)充分利用cup资源 2)简化编程模型 3)简化异步事件处理 4)使GUI更有效率 5)节约成本 2、线程使用:在Java中创建线程有几种方法,每个Java程序至少包含一个线…

软件工程开发文档写作教程(05)—可行性研究报告写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 软件工程开发文档现状 一个软件项目从立项到结尾共有几个阶段:立项,…

动画图解常见串行通讯协议:SPI、I²C、UART、红外分析

一、SPI传输 图1:SPI 数据传输 图1.2:SPI数据传输(2) ​ 图1.3: SPI时序信号 二、IC传输 图1.2.1: I2C总线以及寻址方式 三、UART传输 图1.3.1:PC 上通过UART来调试MCU 图1.3.2:R…

深入探究语音识别技术:原理、应用与实现

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Qt-AES加密库

Qt-AES加密库 AES在线加解密工具[1] Qt-AES加密库[2] Qt AES/DES加密算法库 软件/文件/任意长度字符串加密 试用期许可使用方法软件试用期算法对称加密和非对称加密非对称加密(Asymmetric Cryptography)实例总结加密算法 [3] Qt笔记-AES加密[4] AES 加密…

【Betternet怎么用呢?】Betternet下载使用完整教程

Betternet是一款非常历史悠久的访问世界互联网行业的工具了。知道Betternet的用户,也应该是比较久的互联网用户了。早在2015年左右,那时候的betternet就是很多外贸行业的朋友上gmail以及Facebook上开发客户必备的工具了。 因为那时候betternet使用简单&…

Pandas + ChatGPT 超强组合,pandas-ai :交互式数据分析和处理新方法

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域,Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通过…

第7章链接:静态链接、符号表、符号解析

文章目录 7.2 静态连接7.3 目标文件7.4 可重定位目标文件7.5 符号和符号表7.6 符号解析7.6.1 链接器如何解析多处定义的全局符号7.6.2 与静态库链接7.6.3 链接器如何使用静态库来解析引用 7.2 静态连接 像 Unix ld 程序这样的静态链接器(static linker)…