二十三种设计模式第十五篇--模版方法模式

news2024/9/22 18:00:07

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。通过使用这种模式,我们可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。

模版方法的思想

模板方法模式的核心思想是将一个算法分解为一系列步骤,并将可变的部分封装在子类中,使得子类可以在不改变算法结构的情况下重写这些步骤。这种模式可以很好地实现算法的复用,并提高代码的可扩展性和可维护性。

模版方法模式的两类方法

在模板方法模式中,通常有两类方法:抽象方法和具体方法。抽象方法由抽象类声明,子类必须实现这些方法。具体方法在抽象类中已经实现,并且在算法的执行过程中被调用。子类可以根据需要选择性地覆盖这些具体方法。此外,模板方法还可以包含钩子方法,这些方法在抽象类中有默认实现,但子类可以选择性地进行覆盖。

模板方法的代码实现

在这里插入图片描述

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板方法
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}
public class Cricket extends Game {
 
   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   }
 
   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   }
 
   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}
public class Football extends Game {

   @Override
   void initialize() {
      System.out.println("足球游戏初始化!.");
   }


   @Override
   void startPlay() {
      System.out.println("足球游戏开始!");
   }
 
   @Override
   void endPlay() {
      System.out.println("足球游戏结束!");
   }
}
public class TemplatePatternDemo {
   public static void main(String[] args) {


 
      Game game = new Cricket();
      game.play();
      System.out.println();

      game = new Football();
      game.play();      
   }
}

模板方法的应用场景

模板方法模式在实际开发中有着广泛的应用。例如,

  1. 在Java框架中,我们经常使用模板方法模式来向框架用户提供通过继承实现的。
  2. 对标准功能进行扩展的简单方式。
  3. 模板方法模式还在Servlet中和Mybatis框架中有典型的应用。

通过使用模板方法模式,我们可以更好地组织和管理算法的实现,提高代码的复用性和可维护性。该模式在许多领域都有广泛的应用,并且可以与其他设计模式结合使用,例如策略模式。

结论

总结起来,模板方法模式是一种简化算法实现的设计模式,它通过定义算法的骨架和可变的步骤,使得子类可以在不改变算法结构的情况下重新定义特定的步骤。该模式可以提高代码的可扩展性、可维护性,并促进代码复用。

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

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

相关文章

WebDAV之π-Disk派盘 + FE文件管理器

FE File Explorer是一款功能强大且易于使用的文件管理器,它可以让你轻松地管理内部和外部存储器上的文件和文件夹,支持云存储服务,如派盘、Dropbox等。结合FE File Explorer和派盘可以实现更加高效便捷的文件管理体验。 π-Disk派盘 – 知识…

#systemverilog#进程控制问题#(二)终止进程

二 线程的终止 2.1 命名块 + diable Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块。 这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我…

基于Prometheus 和 Grafana 实现springboot应用监控和服务器监控

目录 1.Prometheus环境搭建 1.1 下载和安装Prometheus 1.2 配置Prometheus 1.3 配置Prometheus抓取Spring Boot应用Metrics 1.4 启动Prometheus 2.Grafana环境搭建 2.1 下载和安装Grafana 2.2 配置Grafana数据源 2.3 创建Dashboard 3、NodeExporter(服务器…

华为云Astro出品《低代码开发者101问》电子书上线

这四年来,在低代码平台的运营和客户支持过程中,我们有幸见证了华为云低代码的成长,也有幸认识了很多有思想、有热情、有行动力的低代码开发者朋友,我们自身对低代码领域的认识和理解也在不断整合、刷新。与开发者、客户、伙伴以及…

Vue3使用混入(混合)

minixs/entity.js:混入代码 //混入的实体类 import { reactive } from vue;const userEntityMixin {setup() {const Admin reactive({id: -1,account: "",userPassword: "",});const Teacher reactive({id: -1,account: "",userP…

Nginx启动、关闭及信息查看命令

1、查找Nginx的位置 ps -aux | grep nginx 2、启动Nginx nginx直接启动,这时候可能出现两种情况: 第一种,就是Nginx已经启动过了,会提示端口被占用,启动失败 我们尝试杀掉占用端口的进程,然后重启 sys…

基于springboot图书个性化推荐系统的设计与实现【附ppt和万字文档(Lun文)和搭建文档】

主要功能 前台登录: ①首页:图书名称查询、图书信息推荐、好书推荐、图书信息展示 ②图书信息:图书类别、图书名称、名称类别作者查询、图书详情、收藏、点赞、评论 ③好书推荐:图书展示、点击查看 ④留言反馈:用户可…

爆肝整理,Docker容器测试-常见问题+解决(汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 问题1&#xff1a…

9 首页和图标定制

9.1 首页 springboot的首页是写在index.html中,而index.html可以放在静态资源存放的任何一个文件夹(public、resources、static)。然后,直接运行,访问localhost:8080即可。 9.2 图标定制 对于springboot2.7.13版本&am…

应用层:域名系统DNS

1.应用层:域名系统DNS(Domain Name System) 笔记来源: 湖科大教书匠:应用层概述 湖科大教书匠:域名系统DNS 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 DNS报文使用运输层的…

Rust 动态数组Vec基本概念及其用法

目录 一、基本概念 Vec是什么? Vec的特点 (1)动态大小: (2)可变性: (3)泛型: 二、基础用法 1. 创建 (1) Vec::new()方法 (2) Vec::from()方法 (3) vec! 宏 2. 基础用法 三、Vec的简单实现及其宏模拟 四、leetcode 实…

vue开发图表echarts基本使用

官网传送门 1.echarts-介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts3.echarts-基础配置 series -- 系列列表。每个系列通过 type 决定自己的图表类型 -- 大白话&#xff…

Web安全——数据库mysql学习

数据库mysql基础 Web安全分享一、数据库的基本操作1、MYSQL登录与退出2、MYSQL数据库的一些解释3、MYSQL注释符有三种: 二、数据库的一些基本操作1、数据库的增删改查(sql语句) 三、table 表的操作1、查看表结构2、查看表的内容3、建立表4、约束条件5、修改表的操作…

小红书发布图文视频笔记软件

小红书发布图文视频笔记软件,🆘这个工具,不愧是做小红书的神!附教程#新媒体 #微信创作者助手 #小红书 微信时刻 软件有月卡、季卡、半年卡、年卡 【引流脚本软件开发定制,欢迎你】 服务时间:(8&#xff1a…

公司新来了个测试,一副毛头小子的样儿,哪想到是新一代卷王。。。

内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。 在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是…

vue基础-某个项目ESLint不生效问题

文章目录 前言一、解决方法二、在配置文件中添加一下配置三、本人电脑的ESLint配置总结 前言 vue基础,最近接手同事的项目,发现ESLint不生效了,找了很久也没有发现问题,因为其他的项目是可以用的。 一、解决方法 1、在vscode中打…

KafKa 3.x(二、Broker,消费者)

4. Kafka Broker 4.1 kafka Broker工作流程 4.1.1 Zoopkeeper存储的Kafka信息 启动Zookeeper客户端通过ls命令查看kafka相关信息 在Zookeeper的服务端存储的Kafka相关信息 /kafka/brokers/ids [0,1,2] 记录那些服务器/kafka/brokers/topics/first/partitions/0/state {“l…

关于超卖程序问题分析-java

关于超卖程序问题分析 1.并发情况下,GET缓存 判断>0,成立,均执行扣减库存,导致超卖 2.加锁 以库存key,加锁,setNx,finally解锁 deleteKey 存在问题 1.误解锁(是不是也是因为…

Android 11 SystemUI 启动流程

SystemUI 有哪内容 从表面上看, 我们看到的状态栏、通知栏、下拉菜单、导航栏、锁屏、最近任务、低电提示等系统页面都是 SystemUI 的。SystemUI,在源码目录中位于: framework/base/packages 目录下, 可见 SystemUI 和 framework…

vue3脚本绑定CodeMirror的使用

代码&#xff1a; <template><CodeMirrorref"codeMirror":value"codeVal":languageSingle"languageSingle":readOnly"!isEdit"submitCode"submitCode"></CodeMirror> </template><script setup…