热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式14模板模式

参考源https:www.bilibili.comvideoBV1u3411P7Na?p22&vd_source299f4bc123b19e7d6f66fefd8f124a03模板

参考源


https://www.bilibili.com/video/BV1u3411P7Na?p=22&vd_source=299f4bc123b19e7d6f66fefd8f124a03




模板模式(Template Pattern)属于行为型模式



概述

在生活中常常会遇到这样的情况,做某一件事情,有些步骤是固定的,有些步骤的变化的。

比如去医院看病,挂号排队这两个步骤是固定的,不管是什么病到了医院都得遵循这两个步骤;但是后续的检查治疗这两个步骤是变化的,不同的病需要采用不同的检查方式,然后采取不同的治疗手段。

针对这一情况,在设计去医院看病这一程序时可以这样实现:定义一个抽象类,固定的步骤用普通方法实现,变化的步骤定义为抽象方法,由子类继承实现。这样就可以根据不同的子类来实现不同的变化步骤,这就是模板模式


代码实现

这里以去医院看病来介绍模板模式:

1、定义抽象疾病

/**
* 疾病
*/
public abstract class Disease {
/**
* 治病
*/
public void cure() {

// 1、挂号
registered();
// 2、排队
queue();
// 3、检查
check();
// 4、治疗
treat();
}
/**
* 挂号
*/
public void registered() {
System.out.println("1、挂号");
}
/**
* 排队
*/
public void queue() {
System.out.println("2、排队");
}
/**
* 检查
*/
public abstract void check();
/**
* 治疗
*/
public abstract void treat();
}

2、定义具体疾病

感冒:

/**
* 感冒
*/
public class Cold extends Disease {
@Override
public void check() {
System.out.println("3、感冒检查:量体温");
}
@Override
public void treat() {
System.out.println("4、感冒开药:感冒灵");
}
}

口腔溃疡:

/**
* 口腔溃疡
*/
public class MouthUlcers extends Disease {
@Override
public void check() {
System.out.println("3、口腔溃疡检查:看口腔");
}
@Override
public void treat() {
System.out.println("4、口腔溃疡开药:西瓜霜");
}
}

3、调用

// 感冒
Disease cold = new Cold();
// 口腔溃疡
Disease mouthUlcers = new MouthUlcers();
// 治疗感冒
cold.cure();
// 治疗口腔溃疡
mouthUlcers.cure();

输出结果:

1、挂号
2、排队
3、感冒检查:量体温
4、感冒开药:感冒灵
1、挂号
2、排队
3、口腔溃疡检查:看口腔
4、口腔溃疡开药:西瓜霜

可以发现,在治疗感冒和口腔溃疡这两种疾病时,前两个步骤是一样的,只有后两个步骤是不同的,这样就实现了复用相同的步骤,后续再定义其他疾病时只需要继承 Disease 实现其抽象方法即可,复用性扩展性都大大提高。


优缺点

优点


1、利用模板方法将相同处理逻辑的代码放到抽象父类中,提高了代码的复用性

2、将不同的代码交由不同的子类实现,通过对子类的扩展增加新的行为,提高代码的扩展性


缺点


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

2、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要添加该方法。


使用场景

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

本文来自博客园,作者:程序航,转载请注明原文链接:https://www.cnblogs.com/codesail/p/16585419.html



推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
author-avatar
她们都叫我哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有