设计模式 - 行为型模式考点篇:模板方法模式(概念 | 案例实现 | 优缺点 | 使用场景)

目录

一、行为型模式

1.1、模板方法模式

1.1.1、概念

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


一句话概括行为型模式

行为型模式:类或对象间如何交互、如何划分职责,从而更好的完成任务.

1.1、模板方法模式

1.1.1、概念

在一个算法骨架中,将某些算法的步骤延迟倒子类中,使得这些算法的可以根据具体的环境实现.

这就像是,我们在设计一个程序的时候经常可能会遇到这种情况:“设计了一个算法步骤,确定了这些步骤的执行顺序,但其中某些步骤还是未知,需要根据具体的业务情况而定”,此时就可以使用模板方法模式,使其放到子类实现.

例如,炒菜的步骤时固定的,分为倒油、热油、倒入要炒食物、倒调料、翻炒这几个步骤,其中 倒油、热油、翻炒这几个步骤是固定的,而炒什么食物 和 倒调料 都是要根据情况而定的.

模板方法模式包含角色:

  • 抽象类:给出一套算法的具体实现和执行顺序,其中包含一些在子类中实现的抽象方法.
  • 具体子类:实现抽象类中定义的抽象方法,他们也是算法执行逻辑的组成步骤.

1.1.2、案例实现

例如上述炒菜案例.

/*** 抽象类: 做菜类*/
public abstract class DoCooking {public void doCooking() {//1.倒油pourOil();//2.热油hotOil();//3.倒食物pourFood();//4.添加调料addSeasoning();//5.翻炒fry();}private void pourOil() {System.out.println("倒油");}private void hotOil() {System.out.println("热油");}/*** 添加食物*/protected abstract void pourFood();/*** 添加调料*/protected abstract void addSeasoning();private void fry() {System.out.println("翻炒");}}
/*** 具体子类: 处理鸡蛋*/
public class HandlerEgg extends DoCooking {@Overrideprotected void pourFood() {System.out.println("将鸡蛋下锅");}@Overrideprotected void addSeasoning() {System.out.println("添加酱油");}}
/*** 具体子类: 处理米饭*/
public class HandlerRice extends DoCooking {@Overrideprotected void pourFood() {System.out.println("将米饭下锅");}@Overrideprotected void addSeasoning() {System.out.println("添加葱花");}}
public class Client {public static void main(String[] args) {//1.炒鸡蛋HandlerEgg egg = new HandlerEgg();egg.doCooking();System.out.println("===================");//2.炒米饭HandlerRice rice = new HandlerRice();rice.doCooking();}}

执行结果如下:

1.1.3、优缺点

优点:

提高代码复用性:将相同代码放到抽象的父类中,不同实现放到不同子类中.

符合开闭原则:将来如果增加一个相关业务吗,只需要扩展实现一个子类,无需修改原有代码.

缺点:

增加系统复杂度:每一个不同实现都需要定义一个子类,会导致类的数量增加,系统更加庞大.

1.1.4、使用场景

  1. 算法的整体步骤固定,只有个别容易改变.
  2. 需要通过子类来决定父类算法中的某步骤的具体实现.

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

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

相关文章

Ansys Zemax | 如何建立LCD背光源模型

本文建立了楔形LCD背光源模型,并对其进行分析,并按照照明输出标准对其进行优化。 附件下载 联系工作人员获取附件 简介 液晶显示器 (LCDs) 作为一种显示技术,在当今社会中已经得到了广泛的应用。在商业领域中最突出的应用包括计算机显示器…

自定义类型

目录 结构体 匿名结构体 结构体嵌套 结构体大小 设置默认对齐数 位段 位段的跨平台问题 Enum枚举 枚举的好处 union联合体 判断大小端 内存大小 结构体 前面我们讲了结构体的基本知识,还有一些知识并没有罗列完全,这篇将结构体剩余的一些小知…

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好,今天为大家带来的是 mysql 5.7 msi , MySql 8.0 版本的下载、安装教程,附详细图文。本文以 5.7 版本为例子,帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址,有…

Spring5应用之事务属性

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具,是一个对象关系映射的框架;在python中提供高效、高性能的数据库访问,企业级的数据持久化模式;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

vscode 资源管理器移动到右边

目录 vscode 资源管理器移动到右边 vscode 资源管理器移动到右边 点击 文件》首选项》设置》工作台》外观》 找到这个配置下拉选择左右

单元测试很难么?也没有吧

前言 你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是…

三次挥手和四次握手

TCP建立连接(三次握手) 经过DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,便会开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接。 第一次握手: 建立连…

(部署服务器系列一)虚拟机模拟部署服务器

1、下载安装vmware 15 (win7最高支持版) 2、下载安装CentOS 配置2核2g(最少)磁盘100g(不会实际占有)选择时区-上海配置分区:https://blog.csdn.net/qq_35363507/article/details/127390889 &a…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒(个人喜好) 任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

虚幻引擎:如何才能对音波(声音资产)进行逻辑设置和操作

案列:调整背景音乐大小 1.创建一个SoundCue 2.进入创建的SoundCue文件 3. 创建音效类和音效类混合 4.进入SoundCue选择需要的音效类 5.然后音效类混合选择相同的音效类 6.然后蓝图中通过节点进行控制音量大小

把二叉搜索树转换为累加树

题目链接 把二叉搜索树转换为累加树 题目描述 注意点 树中的节点数介于 0 和 10000 之间每个节点的值介于 -10000 和 10000 之间树中的所有值 互不相同给定的树为二叉搜索树 解答思路 因为二叉搜索树的性质是左子树的值始终小于根节点的值,右子树的值始终大于根…

Android组件通信——ActivityGroup(二十五)

1. ActivityGroup 1.1 知识点 (1)了解ActivityGroup的作用; (2)使用ActivityGroup进行复杂标签菜单的实现; (3)使用PopupWindow组件实现弹出菜单组件开发; 1.2 具体…

el-upload手动上传图片,上传后隐藏上传样式(el-upload上传单张图片,vue2)

简介:上期介绍了使用el-upload上传文件,这次来介绍一下如何使用el-upload上传图片,只能上传一次,上传图片后隐藏上传按钮部分。 实现效果图: 1、首先,想要在项目中使用el-upload组件,同样&#…

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

LIS系统源码技术特点:采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。 技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要: 生物系统有大量的视觉运动检测神经元,其中一些神经元可以优先对特定的视觉区域做出反应。然而,关于如何使用它们来开发用于全向碰撞检测的神经网络模型,很少有人做过工作。为此&#…

【算法优选】 二分查找专题——贰

文章目录 😎前言🌲[山脉数组的峰顶索引](https://leetcode.cn/problems/peak-index-in-a-mountain-array/)🚩题目描述:🚩算法思路🚩代码实现: 🌴[寻找峰值](https://leetcode.cn/pro…

Oracle 简介与 Docker Compose部署

最近,我翻阅了在之前公司工作时的笔记,偶然发现了一些有关数据库的记录。当初,我们的项目一开始采用的是 Oracle 数据库,但随着项目需求的变化,我们不得不转向使用 SQL Server。值得一提的是,公司之前采用的…

golang使用energy开发GUI桌面程序,CEF,LCL

1、概述 仓库:https://github.com/energye/energy 文档:https://energy.yanghy.cn/ Energy 是 Go 基于 CEF(Chromium Embedded Framework) 开发的框架,内嵌 CEF 二进制 使用 Go 和 Web 端技术 ( HTML CSS JavaScript ) 构建支持Windows, …

MongoDB——centOS7环境Mongodb权限管理(图解版)

目录 一、MongDB权限概述1.1、MongDB权限概述1.2、MongDB权限列表 二、Mongodb权限管理示例2.1、创建账号2.1.1、创建管理员用户2.1.2、开启认证2.1.3、创建普通账号 一、MongDB权限概述 1.1、MongDB权限概述 mongodb是没有默认管理员账号,所以要先添加管理员账号…