首页 > 其他分享 >设计模式05 —— 模板模式

设计模式05 —— 模板模式

时间:2023-10-22 14:11:29浏览次数:36  
标签:05 子类 world 设计模式 方法 Hello 模板

设计模式05 —— 模板模式

本教程参考:菜鸟教程 - 学的不仅是技术,更是梦想! (runoob.com)

参考书:《图解设计模式》

本系列为本人学习笔记,和课程学习笔记,资料和参考均源自互联网,希望各位大佬多多指点!


image

介绍

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

何时使用:有一些通用的方法。

如何解决:将这些通用算法抽象出来。

关键代码:在抽象类实现,其他步骤在子类实现。

应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

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

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词

举例学习

类图

image

定义一个AbstractDisplay方法,方法中只声明了三个抽象方法:open,print,close,和一个具体的方法:display。

image

接下来,实现了两个子类:CharDisplay和StringDisplay

image

这时候传入一个单独的'H'字符,那么最终显示出来的结果就是<<HHHHH>>

image

这时候如果传入一个"Hello,world."这个字符串,那么最终结果就是如下:

+------------+

|Hello,world.|

|Hello,world.|

|Hello,world.|

|Hello,world.|

|Hello,world.|

+------------+

image

注意事项

可以使得逻辑的处理通用化

假如没有模板方法,那么类似的复制和粘贴功能,就需要出现class1,class2等许多个类,如果某个出现了问题,就必须将这个bug的修改反映到所有的class中才行。

父类与子类的一致性

在具体的例子中,无论是CharDisplay的实例还是StringDisplay的实例,都是先保存在AbstractDisplay的类型的变量中,再去调用display方法的。

如果具体的实例的生成交给了子类,就是工厂模式了。

父类和子类之间的协作

如果父类中实现的方法过少,子类就会变得臃肿不堪, 甚至可能出现代码重复。

标签:05,子类,world,设计模式,方法,Hello,模板
From: https://www.cnblogs.com/ZzTzZ/p/17780394.html

相关文章

  • 设计模式-建造者模式
    建造者模式建造者模式(BuilderPattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。介绍意图:将一个复杂的构建与其表示相......
  • Struct ForDemo05
    packagecom.chen.struct;publicclassForDemo05{publicstaticvoidmain(String[]args){int[]numbers={10,20,30,40,50};for(inti=0;i<5;i++){System.out.println(numbers[i]);}System.out.println("=......
  • 05_数组
    ......
  • 405-503 搞懂Kubernetes调度 (DNS ingress NodeSelector NodeAffinity)4.5-5.3
    一、Kubernetes里的DNSK8S集群默认使用CoreDNS作为DNS服务:#kubectlgetsvc-nkube-system|grepdnskube-dnsClusterIP10.96.0.10<none>53/UDP,53/TCP,9153/TCP24d测试在node-1-231安装bind-utilsyuminstall-ybind-utils解析外网域名dig@10......
  • 20211105李宜时《信息安全系统设计与实现》第六周学习笔记
    Ubuntu学习笔记:Unix/Linux进程管理相关基础知识在Ubuntu学习Unix/Linux进程管理之前,需要了解以下基础知识:进程:进程是正在运行的程序的一个实例。每个进程都有一个唯一的进程标识符(PID)。进程状态:进程可以处于运行、睡眠、停止、僵尸等不同状态。进程调度:操作系统负责安......
  • 从零用VitePress搭建博客教程(5) - 如何自定义页面模板、给页面添加独有的className和
    接上一节:从零用VitePress搭建博客教程(4)–如何自定义首页布局和主题样式修改?上一节其实我们也简单说了自定义页面模板,这一节更加详细一点说明,开始之前我们要知道在vitePress中,.md的文件是可以直接编写vue的代码的。比如我们现在来自定义一个前端网址导航页面八、自定义一些......
  • 使用axum构建博客系统 - 模板
    我们的博客分为“前台”和“后台”两部分。前台用于展示博客内容,后台用于管理博客。本章我们将编写前台和后台的基础模板以及对应的路由。目录结构前台模板位于 templates/frontend,后台模板位于templates/backend。前台我们的前台模板基于 Bootstrap的Blog 修改而来布局......
  • 使用axum构建博客系统 - 后台管理菜单及首页模板
    目前,后台管理功能基本完成,但还有两个工作没做:清理后台管理的导航菜单以及后台管理首页的模板。后台管理菜单<!--templates/backend/base.html--><!--...--><divclass="container-fluid"><divclass="row"><navid="sidebarMenu"c......
  • springboot使用form标签在两个html页面之间实现界面跳转,出现405问题,但是一刷新就能出
    问题描述在我使用form标签的action属性实现两个html页面之间的跳转,但是出现了这样的问题:问题解决我尝试将这一块内容去掉:然后再次尝试:页面出来啦~问题解决啦~~......
  • 20231405罗马数字转阿拉伯数字(选做)
    罗马数字转阿拉伯数字(选做)任务详情参考https://blog.csdn.net/a197p/article/details/75475456,回答1罗马数字是位置计数吗?它的缺点是什么?2把你的8位学号转化成罗马数字3参考上面的博客,用Pyhton写一个罗马数字转化为阿拉伯数字的程序,并验证上面你的学号对不对作业一 位......