模板方法设计模式解读

news2024/11/17 13:36:45

目录

豆浆制作问题

模板方法模式基本介绍

基本介绍

模板方法模式的原理类图

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

应用实例要求

思路分析和图解(类图)

 模板方法模式的钩子方法

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


豆浆制作问题

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

模板方法模式基本介绍

基本介绍

1) 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2) 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3) 这种类型的设计模式属于行为型模式。

模板方法模式的原理类图


对原理类图的说明-即(模板方法模式的角色及职责)
1) AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operationr2,3,4
2) ConcreteClass 实现抽象方法 operationr2,3,4, 以完成算法中特点子类的步骤 

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

应用实例要求

编写制作豆浆的程序,说明如下:
制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)

思路分析和图解(类图)

 SoyaMilk 

public abstract class SoyaMilk {

    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("第四步黄豆和配料放到豆浆机去打碎");
    }

}

 RedBeanSoyaMilk 

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

 PeanutSoyaMilk  

public class PeanutSoyaMilk  extends  SoyaMilk{

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

 Client 

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();
    }
}

 

 模板方法模式的钩子方法

1) 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
2) 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

public abstract class SoyaMilk {

    final  void make(){
        select();
        if (customerWantCondiments()){
            addCondiments();
        }
        soak();
        beat();
    }

    boolean customerWantCondiments() {
        return true;
    }

    void  select(){
        System.out.println("第一步选好材料");
    }
    abstract  void  addCondiments();

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

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

}

PureSoyaMilk  

public class PureSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {

    }

    @Override
    boolean customerWantCondiments() {
        return false;
    }
}

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

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

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

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

相关文章

Adobe认证是什么?

Adobe认证又称为Adobe国际认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 Adobe认证包括产品技能认证和职业技能认证多个级别,从初学者到专业人士都可以参加。 Adobe认证覆盖了各…

ORA-27090故障,关于AIO-MAX-NR

在给某银行进行巡检时发现asm中的alert一直报ORA-27090错误。 通过巡检脚本,整理错误发生时间如下: 信息收集: 发生类似的错误,先收集alert日志的信息,操心系统的message日志。 Errors in file /u01/app/grid/diag/…

适合小白学习预处理与程序环境,这篇文章就够了

目录 一. 前言 二. 正文 2.1 “冷知识”:程序环境 2.21 翻译环境——程序从无到有:程序编译 链接 2.22 运行环境——程序开跑 2.3 那些鲜为人知:预定义符号 2.4 预处理指令 #define 2. 41 #和## —— 2.42 宏和函数优劣对比 2.…

阿里全新推出:微服务突击手册,把所有操作都写出来了

今天给大家带来的这份微服务是由阿里巴巴高级技术专家整理,针对Spring Cloud在国内的使用情况,结合国内上百家企业使用Spring Cloud落地微服务架构时遇到的问题和相应的解决方案结合成了这份电子版教程。(文末有免费的获取方式) …

火伞云APP盾,您身边的DDoS攻击安全保护专家

近年来全球各地区DDoS攻击的比例和次数在逐年增加,严重影响到网络信息安全。 主要有以下原因: 攻击成本低,攻击无壁垒。进行DDoS攻击成本很低,最低甚至只需要几百元就可以轻松发起一次攻击,然而被攻击的对象可能动辄…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

九种 OOM 常见原因及解决方案(IT枫斗者)

九种 OOM 常见原因及解决方案(IT枫斗者) 什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明:Thrown when the Java Virtual Machine canno…

使用 Amazon SageMaker 构建文本摘要应用

背景介绍 文本摘要,就是对给定的单个或者多个文档进行梗概,即在保证能够反映原文档的重要内容的情况下,尽可能地保持简明扼要。质量良好的文摘能够在信息检索过程中发挥重要的作用,比如利用文摘代替原文档参与索引,可…

数据结构复习题(包含答案)

第一章 概论 一、选择题 1、研究数据结构就是研究( D )。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作 2、算法分析的两个主要方面是( A …

Multi-modal Alignment using Representation Codebook

Multi-modal Alignment using Representation Codebook 题目Multi-modal Alignment using Representation Codebook译题使用表示子空间的多模态对齐期刊/会议CVPR 摘要:对齐来自不同模态的信号是视觉语言表征学习(representation learning)…

SpringMVC文件上传、异常处理、拦截器

SpringMVC文件上传、异常处理、拦截器 基本配置准备&#xff1a;maven项目模块 application.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.…

数据库系统-数据物理存储

文章目录 一、DBMS原理1.1 DB物理存储1.1.1 磁盘的结构&特性1.1.2 DBMS数据存储&查询原理记录&#xff1a;磁盘块 1.2 DB文件组织方法1.2.1 无序文件组织1.2.2 有序记录文件1.2.3 散列文件(Hash File)1.2.4 聚簇文件(Clustering File) 1.3 Oracle 物理存储简介 一、DBM…

程序员最常见的谎言

小伙伴们大家好&#xff0c;我是阿秀。 上周看到知乎上有位网友总结了自己的10年程序员生涯中最常说的一些谎言&#xff0c;一共有15条&#xff0c;看完我直呼内行&#xff01;&#xff01; 全中&#xff01;每一枪都中了&#xff01;每一条我都说过。 我基本都说过他说过的那些…

下载VMware安装Ubuntu18.04.6系统

文章目录 前言&#xff1a;1. 下载VMWare与Ubuntu镜像2. 安装VMware3. VMware下安装Ubuntu 前言&#xff1a; 这篇文章是为交叉编译做的铺垫&#xff0c;本文内容比较简单&#xff0c;按步骤操作即可。 1. 下载VMWare与Ubuntu镜像 为了节约大家时间&#xff0c;省的各种找&am…

【Unity VR开发】结合VRTK4.0:摄像机碰撞变黑

语录&#xff1a; 人是要长大的&#xff0c;有天你也会推着婴儿车幸福地在街上行走&#xff0c;而曾经的喜欢&#xff0c;不管曾经怎样&#xff0c;都会幻化成风&#xff0c;消失在时光的隧道。所以向前走&#xff0c;向前走&#xff0c;无须回头。 前言&#xff1a; 往往我们在…

基于html+css的图片展示12

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

新品发布 | 智安网络【零信任SDP访问控制系统】正式上线!

近日&#xff0c;根据《2022年云办公行业研究报告》显示&#xff0c;2021-2023年&#xff0c;中国协同办公行业保持每年10%以上的增长率&#xff0c;远程办公人员的数量在过去十年中增长了115%&#xff0c;互联网时代已迎来远程办公需求大潮。 风口之下&#xff0c;员工对企业…

Go语言基础——通过获取网站API的cUrl,生成可直接执行的request代码(附:详细实战案例和源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、cUrl是什么&#xff1f;二、cUrl如何获取…

OpenAI-ChatGPT最新官方接口《从0到1生产最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十一)(附源码)

Production Best Practices 生产最佳实例 前言Introduction 导言Setting up your organization 设置您的组织Managing billing limits 管理计费限额API keys API密钥Staging accounts 演示账户 Building your prototype 构建您的原型Additional tips 其它技巧 Techniques for i…

【Java 数据结构】队列的实现及相关OJ题

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…