当前位置: 首页 > news >正文

设计模式-模板方法模式

模板方法模式

  • 问题背景
  • 解决方案:模板方法模式
    • 基本介绍
    • 解决问题
    • 代码示例
    • 运行结果
  • 钩子方法
  • 注意事项和细节

问题背景

豆浆的制作:

1)制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
4)请使用模板方法模式完成

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

解决方案:模板方法模式

基本介绍

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

解决问题

首先我们来画出UML类图:
在这里插入图片描述
1)SoyaMikl抽象类是豆浆的制作类
2)select()方法是选择黄豆,这一步所有豆浆都是通用的,所以在SoyaMilk抽象类就可以实现
3)add()方法是添加配料,因为添加配料不同,制作出的豆浆口感不同,所以我们在SoyaMilk抽象类中实现一个抽象方法,交给子类去实现。
4)soak()方法是浸泡黄豆和配料,beat()方法是放到豆浆机打碎,这两个方法都是通用的,所以也在抽象类中实现。
5)make()方法是对外提供的一个调用方法,make()方法调用了下面4个方法,对于调用者来说直接调用SoyaMilk的make()方法就可以制作豆浆了

代码示例

public abstract class SoyaMilk {/*** 制作豆浆*/public void make() {select();add();soak();beat();}/*** 挑选黄豆*/private void select() {System.out.println("挑选上好的黄豆");}/*** 添加配料*/public abstract void add();/*** 浸泡*/private void soak() {System.out.println("将黄豆和配料一起浸泡三个小时");}/*** 打碎*/private void beat() {System.out.println("放到豆浆机中打碎");}
}
/*** 红豆豆浆*/
public class BlackBeanSoyaMilk extends SoyaMilk{@Overridepublic void add() {System.out.println("加入配料红豆");}
}
/*** 花生豆浆*/
public class PennutSoyaMilk extends SoyaMilk{@Overridepublic void add() {System.out.println("加入配料花生");}
}
public class Client {public static void main(String[] args) {// 制作红豆豆浆SoyaMilk blackBeanSoyaMilk = new BlackBeanSoyaMilk();blackBeanSoyaMilk.make();// 制作花生豆浆SoyaMilk pennutSoyaMilk = new PennutSoyaMilk();pennutSoyaMilk.make();}
}

运行结果

在这里插入图片描述

钩子方法

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

注意事项和细节

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

相关文章:

设计模式-模板方法模式

模板方法模式 问题背景解决方案:模板方法模式基本介绍解决问题代码示例运行结果 钩子方法注意事项和细节 问题背景 豆浆的制作: 1)制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎 2)通过添加不同…...

9. python的if语句

文章目录 一、if结构1.1 比较符号1.1.1 使用比较两个数据是否相等&#xff1a;1.1.2 使用!号比较数据是否不相等1.1.3 使用<号比较数字大小关系1.1.4 使用<号比较数字大小关系1.1.5 使用>号比较数字大小关系1.1.6 使用>号比较数字大小关系 1.2 关键字1.2.1 and关键…...

并发编程的基础知识

并发编程的优缺点 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到提升方便进行业务拆分&#xff0c;提升系统并发能力和性能&#xff1a;在特殊的业务场景下&#xff0c;先天的就适合于并发编程。现在的系统动…...

C 语言风格的字符串,非 string 类如何初始化字符串,以及操作字符串的函数(C++复习向p12)

C 风格的字符串 以 C 风格初始化字符串&#xff0c;有这 2 种方法。其中的 ‘\0’ 是字符串结束符号&#xff0c;是 null 字符 char site[7] {R, U, N, O, O, B, \0}; char site[] "RUNOOB";C 中操作字符串的函数 (以null结尾的字符串) strcpy(s1, s2) 把 s2 复…...

Linux文件系统、磁盘I/O是怎么工作的?

同CPU、内存一样&#xff0c;文件系统和磁盘I/O&#xff0c;也是Linux操作系统最核心的功能。磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘基础上&#xff0c;提供了一个用来管理文件的树状结构。 目录&#xff1a; 一. 文件系统 1. 索引节点和目录项 2. 虚拟文件系…...

设计原则之接口隔离原则

tip: 需要《设计模式之禅》的书籍&#xff0c;可以联系我 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 相关规则&#xff1a; 1.6大设计规则-迪米特法则 …...

ubuntu20.04 ffmpeg mp4转AES加密的m3u8分片视频

样本视频(时长2分35秒): 大雄兔_百度百科 大雄兔_百度百科不知大家否看过世界上第一部开源电影&#xff1a;Elephants Dream&#xff08;大象之梦&#xff09;。这是一部由主要由开源软件Blender制作的电影短片&#xff0c;证明了用开源软件也能制作出效果媲美大公司的作品。…...

Java08——继承

1. 继承 父类&#xff1a; package com.zsq.extend.improve_; //是pupil和graduate的父类 public class Student {public String name;public int age;private double score;public void info(){System.out.println("姓名&#xff1a;" name " 年龄&#xff1…...

C++高级语法

文章目录 C高级语法面向对象 -- 类/结构体抽象-具体类型 标准I/O流I/O流I/O缓存区 文件操作头文件的重复包含问题深拷贝和浅拷贝&#xff0c;写时复制面向对象的三大特性面向对象是什么 C高级语法 面向对象 – 类/结构体 C使用class定义一个类&#xff0c;使用struct定义一个…...

React学习笔记九-高阶函数与函数柯里化

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第九篇&#xff0c;主要介绍高阶函数与函数柯里化。 高阶函数&#xff0c;和函数的柯里化&#xff0c;是学习react的拓展&#xff0c;方便以后优化代码&#xff0c;更好的学习react。…...

2023年电工杯B题半成品论文使用讲解

注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。该文件为半成品论文&#xff0c;即引导大家每一步做什么&#xff0c;怎么做&#xff0c;展示按着本团队的解题思路进行建模…...

第1关:ODBC程序设计

第1关&#xff1a;ODBC程序设计 任务描述相关知识ODBC主要功能ODBC接口主要函数ODBC应用程序开发实例DM ODBC应用程序开发总体流程DM ODBC代码编写流程DM ODBC代码编写实例 编程要求测试说明代码参考&#xff1a; 任务描述 本关任务&#xff1a;使用 ODBC 查询表中数据。 相关…...

Kotlin笔记(零)简介

百度百科简介 2017年&#xff0c;google公司在官网上宣布Kotlin成为Android的开发语言&#xff0c;使编码效率大增。Kotlin 语言由 JetBrains 公司推出&#xff0c;这是一个面向JVM的新语言 参考资料 官网&#xff1a;https://kotlinlang.org/中文官网&#xff1a;https://w…...

android 12.0去掉usb授权提示框 默认给予权限

1.概述 在12.0的系统rom产品开发中,在进行iot开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便,这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限 2.去掉usb授权提示框 默认给予权限的相关代码 frameworks/bas…...

工作积极主动分享,善于业务沟通

工作积极主动分享&#xff0c;善于业务沟通 目录概述需求&#xff1a; 设计思路实现思路分析1.工作积极主动承担责任2.善于沟通3.一起常常lauch 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;…...

Opencv-C++笔记 (1) : opencv的数据结构

文章目录 一、OPNECV元素1.CvPoint2、模板类Size模版类Rect模版类RotatedRect模版类 二、MAT1.使用(nrows, ncols, type)&#xff0c;初始化2维矩阵如果需要深拷贝&#xff0c;则使用clone方法。 三、Vec类 一、OPNECV元素 1.CvPoint 为了方便使用&#xff0c;opencv又对常用的…...

什么是时间复杂度?

时间复杂度定义&#xff1a;在计算机科学中&#xff0c;时间复杂性&#xff0c;又称时间复杂度&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用大O符号表述&#xff0c;不包括这个函数的…...

Spring框架中有哪些不同类型的事件

Spring框架中有哪些不同类型的事件 Spring框架中有哪些不同类型的事件 Spring框架中有哪些不同类型的事件 Spring 提供了以下5种标准的事件&#xff1a; 上下文更新事件&#xff08;ContextRefreshedEvent&#xff09;&#xff1a;在调用ConfigurableApplicationContext 接口…...

Codeforcs 1732C2 暴力

题意 传送门 Codeforcs 1732C2 题解 方便起见&#xff0c;区间表示为左闭右开。观察到 f ( l , r ) ≥ f ( l ′ , r ′ ) , [ l ′ , r ′ ) ∈ [ l , r ) f(l,r)\geq f(l,r),[l,r)\in [l,r) f(l,r)≥f(l′,r′),[l′,r′)∈[l,r)&#xff0c;满足单调性&#xff0c;则 […...

Python安全和防护:如何保护Python应用程序和用户数据的安全

章节一&#xff1a;引言 在当今数字化时代&#xff0c;数据安全是一个极其重要的话题。随着Python的广泛应用和越来越多的人使用Python构建应用程序&#xff0c;保护Python应用程序和用户数据的安全变得尤为重要。本文将介绍一些关键的Python安全问题&#xff0c;并提供一些保…...

智能声控LED楼道灯电路设计与实现

1. 智能声控LED楼道灯的设计初衷 每次深夜回家摸黑找楼道开关的经历&#xff0c;相信大家都深有体会。传统楼道灯要么需要手动开关&#xff0c;要么长明浪费电力&#xff0c;而智能声控LED灯正是为解决这些痛点而生。这种灯具融合了声控、光控和LED照明三项技术&#xff0c;白…...

OpenCore Legacy Patcher深度指南:老旧Intel Mac的系统升级解决方案

OpenCore Legacy Patcher深度指南&#xff1a;老旧Intel Mac的系统升级解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一…...

万兆光模块:网络提速的核心引擎

在数字化转型的浪潮中&#xff0c;数据已成为核心生产要素&#xff0c;而连接数据的网络&#xff0c;则是决定其流动速度与效率的关键。当我们沉浸在4K/8K的视觉盛宴中&#xff0c;惊叹于云游戏的即时交互&#xff0c;或是受益于远程医疗的精准诊断时&#xff0c;背后都离不开一…...

11款独特开源字体,让你的创意设计焕发生机

11款独特开源字体&#xff0c;让你的创意设计焕发生机 【免费下载链接】HoYo-Glyphs Constructed scripts by HoYoverse 米哈游的架空文字 项目地址: https://gitcode.com/gh_mirrors/ho/HoYo-Glyphs 在数字创作领域&#xff0c;字体是视觉表达的核心元素。然而&#xf…...

易语言网络验证系统源码(完整可编译版)|支持周/月/季/年/卡密生成

温馨提示&#xff1a;文末有联系方式产品概述 本套源码为基于易语言开发的高性能网络验证系统&#xff0c;功能完整、结构清晰&#xff0c;已通过实际编译测试&#xff0c;开箱即用。核心特性 系统采用客户端-服务端通信机制&#xff0c;支持远程在线验证&#xff0c;有效防止本…...

Tao-8k本地部署详解:基于Ubuntu系统的环境配置与优化

Tao-8k本地部署详解&#xff1a;基于Ubuntu系统的环境配置与优化 最近有不少朋友在问&#xff0c;怎么在自己的GPU服务器上把Tao-8k这个大家伙跑起来。说实话&#xff0c;第一次部署的时候我也踩了不少坑&#xff0c;从驱动版本不对到端口被占&#xff0c;各种小问题层出不穷。…...

SDMatte+在影视后期应用:绿幕替代方案探索、道具透明化处理与VFX资产快速提取

SDMatte在影视后期应用&#xff1a;绿幕替代方案探索、道具透明化处理与VFX资产快速提取 1. 影视后期中的抠图挑战 在影视后期制作中&#xff0c;高质量的抠图技术是视觉特效(VFX)的基础。传统绿幕拍摄虽然成熟&#xff0c;但存在诸多限制&#xff1a; 需要专门的拍摄场地和…...

《常见三维CAD模型表示法》

表示法核心思想 / 定义数据结构 / 关键特点优点缺点CAD中的应用场景常见软件 / 文件格式B-rep (边界表示)通过精确记录物体的边界&#xff08;顶点、边、面&#xff09;及其拓扑关系&#xff08;邻接、归属&#xff09;来定义实体包含几何信息&#xff08;点坐标、曲线方程、曲…...

实战分享:如何用星图平台零代码私有化Qwen3-VL:30B,并接入飞书实现智能对话

实战分享&#xff1a;如何用星图平台零代码私有化Qwen3-VL:30B&#xff0c;并接入飞书实现智能对话 1. 项目概述与价值 在当今企业智能化转型的浪潮中&#xff0c;如何快速部署私有化大模型并实现业务场景落地&#xff0c;成为许多技术团队面临的挑战。本文将详细介绍如何通过…...

人工智能之数字生命 认知架构白皮书 第4章

《HY-Ego 认知架构白皮书》&#xff08;续&#xff09;4. 世界树&#xff08;World Tree&#xff09;——全局世界骨架 世界树是 HY-Ego 认知架构的全局事实骨架&#xff0c;负责对整个“世界”进行结构化建模、组织和维护。它与因果树并行独立运行&#xff0c;二者通过快照机制…...