【行为型模式】模板方法模式

一、模板方法模式概述

        模板方法模式定义在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。(类对象型模式)

  • 模板方法中的基本方法是实现算法的各个步骤,是模板方法的组成部分。基本方法又可以分为三种:
    • 抽象方法:抽象方法就是在抽象类中声明并由子类实现的方法;
    • 具体方法:具体方法可以由抽象类实现,或者由子类覆盖实现;
    • 钩子方法:钩子方法可以由抽象类实现,子类可以加以扩展。
      • 钩子方法又分为两类:
        • 第一类钩子方法是可以与一些具体步骤挂钩,以实现在不同条件下执行模板方法的不同步骤,这类方法一般返回boolean,方法名一般为isXXX();
        • 第二类钩子方法是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法
  • 模板方法模式的优缺点
    •  优点: 
      •  1.封装不变部分,扩展可变部分;
      •  2.提取公共代码,便于维护;
      •  3.行为由父类控制,子类实现。
  • 缺点:
    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
  • 使用场景: 
    • 1.有多个子类共有的方法,且逻辑相同;
    • 2.重要的、复杂的方法,可以考虑作为模板方法。

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

二、代码实现

        模板方法模式有两个角色:

  • AbstractClass(抽象类):抽象类中定义了一系列基本操作,这些操作是具体的也可以是抽象的,每一个基本操作对应算法的一个步骤,在子类中可以重定义或实现这些步骤,同时抽象类实现了一个模板方法,定义一个算法的框架;
  • ConcreteClass(具体子类):实现父类中的抽象基本方法,或者覆盖父类中具体基本操作。
        2.1 抽象类
package Template.common;public abstract class AbstractClass {// 模板方法定义的框架-->这就是模板方法,是final的public final void templateMethod() {/*** 调用基本方法,完成固定逻辑* 基本操作,是由子类实现的方法*/concreteOperattion();primitiveOperation1();primitiveOperation2();if(primitiveOperation3())System.out.println("符合钩子方法条件");elseSystem.out.println("不符合钩子方法条件");primitiveOperation4();}// 抽象类的具体操作,共同的且繁琐的操作private void concreteOperattion() {// do somethingSystem.out.println("子类一定会实现的方法concreteOperattion");}  public void primitiveOperation1(){System.out.println("抽象类具体方法primitiveOperation1");}// 抽象类抽象方法:由子类必须实现的操作protected abstract void primitiveOperation2();//第一类钩子方法public boolean primitiveOperation3(){return false;}//第二类钩子方法:默认不做事的方法,子类可以视情况决定要不要覆盖它public void primitiveOperation4(){}}
        2.2 具体子类
package Template.common;public class ConcreteClass1 extends AbstractClass {@Overridepublic void primitiveOperation2(){System.out.println("可以不实现primitiveOperation3、primitiveOperation4,但是一定有primitiveOperation2");}public boolean primitiveOperation3(){return true;// 如果想钩子方法返回false可以不实现该方法// 因为父类默认返回false// return false;}public void primitiveOperation4(){System.out.println("子类覆盖父类第二类钩子方法");}
}
package Template.common;public class ConcreteClass2 extends AbstractClass {@Overrideprotected void primitiveOperation2() {// TODO Auto-generated method stub//必须继承的类System.out.println("可以不实现primitiveOperation3、primitiveOperation4,但是一定有primitiveOperation2");}}
        2.3 main方法实现模板方法
package Template.common;public class TemplateClient {public static void main(String[] args) {// TODO Auto-generated method stubAbstractClass abstractClass1 = new ConcreteClass1();AbstractClass abstractClass2 = new ConcreteClass2();System.out.println("------ConcreteClass1-------");applyTemplate(abstractClass1);System.out.println("------ConcreteClass2-------");applyTemplate(abstractClass2);}public static void applyTemplate(AbstractClass abstractClass){abstractClass.templateMethod();}}
        2.4 UML图

三、代码结构图

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

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

相关文章

rocketmq-dashboard打包测试报错

rocketmq-dashboard运行的时候没问题,但是打包执行测试的时候就是报错 这时候跳过测试就可以成功 报错为 There are test failures. Please refer to D:\CodeEn\rocketmq-dashboard\target\surefire-reports for the individual test results. 你只需要跳过测试就…

【刷题笔记】第九天

文章目录 [LCR 189. 设计机械累加器](https://leetcode.cn/problems/qiu-12n-lcof/)[2007. 从双倍数组中还原原数组](https://leetcode.cn/problems/find-original-array-from-doubled-array/) LCR 189. 设计机械累加器 c专属解法:使用sizeof函数 1 2 3 … ta…

查看transformers模型对应的device的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

3D抓取算法中的PointNet++网络介绍

3D抓取算法是一个在机器人抓取任务中广泛使用的算法基线,它结合了深度学习和计算机视觉技术来预测给定三维点云场景中物体的抓取姿态。在这个基线算法中,PointNet 网络是一个关键组件,用于从点云数据中提取有效的特征表示。 下面是关于 3D抓…

vue框架中的路由

vue框架中的路由 一.VueRouter的使用(52)二.路由模块封装三.声明式导航 - 导航链接1.router-link-active类名2.router-link-exact-active类名3.声明式导航-自定义类名 四.查询参数传参五.动态路由传参方式查询参数传参 VS 动态路由传参 六.动态路由参数的…

刷刷刷刷算法

链表 24. 两两交换链表中的节点 /*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* return {ListNode}*/ var swapPai…

javaWeb项目-毕业生就业信息管理系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、JSP技术 JSP(Jav…

【Canvas技法】四条C形色带填满一个圆/环形

【关键点】 通过三角函数计算控制点的位置。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>四条C形色带填满一个…

渐进式交付实践:通过 Argo Rollouts 和 FSM Gateway 实现金丝雀发布

渐进式交付&#xff08;Progressive delivery&#xff09;是一种软件发布策略&#xff0c;旨在更安全、更可控地将新版本软件逐步推出给用户。它是持续交付的进一步提升&#xff0c;允许开发团队在发布新版本时拥有更细粒度的控制&#xff0c;例如可以根据用户反馈、性能指标和…

【Docker】安装Redis、Nginx、MongoDb、Jenkins

1、安装redis mkdir -p /docker/redis mkdir -p /docker/redis/data touch /docker/redis/redis.conf touch /docker/redis/redis.bash编辑配置文件 vim /docker/redis/redis.conf # Redis配置文件# Redis默认不是以守护进程的方式运行&#xff0c;可以通过该配置项修改&…

css八股

伪类&#xff0c;伪元素 伪类&#xff1a; 1.指某种特定的行为或者状态&#xff0c;例如鼠标悬停&#xff0c;点击&#xff0c;第一个子元素等 2.以&#xff1a;开头&#xff0c;&#xff1a;hover&#xff0c;&#xff1a;focus 3.伪类不会形成新的元素&#xff0c;只会改…

柱层析SOP

1.TLC检测 尝试极性PE:EA的比值由5&#xff1a;1 到1&#xff1a;1&#xff0c;如若色谱上点未发生变化&#xff0c;再继续尝试极性DCM:MeOH由5&#xff1a;1 到 1&#xff1a;1。 但需保证各点的Rf分布在0.1到0.9之间。 PE:石油醚 EA&#xff1a;乙酸乙酯 DCM&am…

【论文阅读】YOLO-World | 开集目标检测

Date&#xff1a;2024.02.22&#xff0c;Tencent AI Lab&#xff0c;华中科技大学Paper&#xff1a;https://arxiv.org/pdf/2401.17270.pdfGithub&#xff1a;https://github.com/AILab-CVC/YOLO-World 论文解决的问题&#xff1a; 通过视觉语言建模和大规模数据集上的预训练来…

ruoyi-nbcio-plus基于vue3的flowable的消息中心我的消息的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Python数据可视化:散点图matplotlib.pyplot.scatter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 Python数据可视化&#xff1a; 散点图 matplotlib.pyplot.scatter() 请问关于以下代码表述错误的选项是&#xff1f; import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7,…

热塑性聚氨酯TPU的特性有哪些?UV胶水能够粘接热塑性聚氨酯TPU吗?又有哪些优势呢?

热塑性聚氨酯&#xff08;Thermoplastic Polyurethane&#xff0c;TPU&#xff09;是一种具有多种优异性能的弹性塑料&#xff0c;广泛用于各种应用领域。以下是TPU的一些主要特性&#xff1a; 弹性和柔软性&#xff1a; TPU具有良好的弹性和柔软性&#xff0c;能够在受力后迅速…

JVM复习总结2024.4.18(很重要)

一、 1. 基于JDK1.8的String intern()方法解析 intern方法 1.8&#xff1a; 调用字符串对象的intern方法&#xff0c;会将该字符串对象尝试放入到串池中 如果串池中没有该字符串对象&#xff0c;则放入成功如果有该字符串对象&#xff0c;则放入失败 无论放入是否成功&#xff…

数据库-Redis(18)

目录 86.Redis 分布式锁的实现?什么是RedLock? 87.Redis缓存有哪些问题,如何解决? 88.Redis性能问题有哪些,如何分析定位解决?

短视频批量采集提取软件|视频下载工具

短视频批量采集提取软件&#xff1a;高效获取视频资源 一、开发背景 在日常业务中&#xff0c;我们经常需要获取大量的短视频资源&#xff0c;以支持各种需求&#xff0c;但传统的获取方式过于繁琐&#xff0c;一一复制链接下载效率低下。基于此需求&#xff0c;我们开发了一…

Jenkins机器已经安装了ansible, 运行的时候却报错ansible: command not found

操作系统&#xff1a;MacOS Jenkins log提示 ansible: command not found 直接在Jenkins 机器中&#xff0c;进入一样的目录执行ansible --version OK 原因&#xff1a; Jenkins 默认使用的环境是 /usr/bin, 而我的ansible 安装配置在conda3 下面&#xff0c;所以需要在Jenkin…