23种设计模式之模板模式

文章目录

23种设计模式之模板模式

; 概述

模板模式指:一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。

模板方法模式是一种只需使用继承就可以实现的非常简单的模式。

模版模式的优缺点

优点

  • 封装不变的部分,将不变的部分抽取出来;
  • 扩展可变部分,将可变的设置抽象方法,让具体子类来实现。
  • 抽取的公共代码,便于后期维护
  • 行为有基类来控制,具体操作有子类实现。

缺点

  • 每一个不同的实现都需要有一个子类来实现,这样就会导致类的数量大大的增加,使得系统更加庞大。

模版模式的使用场景

在软件设计中,有些功能很类似,只是在某些环节不同而已。大多数环节都是相同的时候,可以使用模板模式。将通用的算法或者步骤抽取到抽象类中,在具体子类中实现具体特定的操作

模板模式的结构和实现

模式结构

模板方法模式由两部分结构组成

第一部分是抽象父类

第二部分是具体的实现子类。

通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。

模式实现

我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。 CricketFootball 是扩展了 Game 的实体类,它们重写了抽象类的方法。

TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。

23种设计模式之模板模式
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 endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

public class TemplatePatternDemo {
   public static void main(String[] args) {

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

输出结果:

Cricket Game Initialized! Start playing.

Cricket Game Started. Enjoy the game!

Cricket Game Finished!

Football Game Initialized! Start playing.

Football Game Started. Enjoy the game!

Football Game Finished!

总结

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

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

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

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

更多请移驾。。。

🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1659451067
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽

23种设计模式之模板模式
JVM内存泄漏和内存溢出的原因
JVM常用监控工具解释以及使用
Redis 常见面试题(一)
ClickHouse之MaterializeMySQL引擎(十)
三种实现分布式锁的实现与区别
线程池的理解以及使用

号外!号外!
最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。想获取吗?如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号。资料在公众号里静静的躺着呢。。。

23种设计模式之模板模式
  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论*
    一键四连,你的offer也四连**

Original: https://www.cnblogs.com/cuizb/p/16709537.html
Author: Java技术债务
Title: 23种设计模式之模板模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576236/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spark学习(1) Spark入门

    什么事spark Spark是一种快速、通用、可扩展的大数据计算引擎.项目是用Scala进行编写,基于内存计算的 包括交互式查询和流处理 spark内置项目 Spark SQL:是…

    数据库 2023年6月16日
    092
  • 相同执行计划,为何有执行快慢的差别

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 今天遇到一个很神奇的现象,…

    数据库 2023年5月24日
    085
  • MySQL执行一条查询语句的过程

    查询缓存 在解析一个查询语句之前,如果查询缓存时打开的,那么 MySQL 会优先检查这个查询是否命中查询缓存中的数据。这个检查时通过一个对大小写敏感的哈希查找实现的。查询和缓存中的…

    数据库 2023年5月24日
    0112
  • Linux 服务管理

    Linux 服务管理 1. 基本介绍 服务的本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如mysqld,sshd,防火墙等,因此我们又称为守护线程…

    数据库 2023年6月6日
    0103
  • atomic 原子自增工程案例

    案例 1 : 简单用法 atomic_int id; atomic_fetch_add(&id, 1) atomic_uint id; atomic_fetch_add(&…

    数据库 2023年6月9日
    092
  • mysql进阶

    mysql进阶 1.下载二进制格式的mysql软件包 [root@mr ~]# wget https://downloads.mysql.com/archives/get/p/23…

    数据库 2023年5月24日
    0133
  • Python 学习笔记(六)–线程

    1.自定义进程 自定义进程类,继承Process类,重写run方法(重写Process的run方法)。 from multiprocessing import Process im…

    数据库 2023年6月16日
    0126
  • 测试左移和测试右移,我们为何要“上下求索”?

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7b9ad46d.html 你好,我是测试蔡坨坨。 今天,我们来聊一聊测试左移和测试右移。 传统测试流程…

    数据库 2023年6月11日
    090
  • 07-MyBatis中的动态标签

    MyBatis中的动态标签 1、if标签 if标签是为了判断传入的值是否符合某种条件,比如是否不为空 2、where标签 where标签可以用来做动态拼接查询条件,当和 if标签配…

    数据库 2023年6月16日
    077
  • 手把手教你使用 Java 在线生成 pdf 文档

    一、介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票、订单的库存打印单、各种电子签署合…

    数据库 2023年6月14日
    0117
  • 磁盘空间满,如何处理?

    作为运维人员,磁盘空间报警是最寻常遇到的情况,那么遇到空间如何处理呢?这里介绍一下处理办法及处理思路。 操作系统:centos系统 、Ubuntu 1 定位目录 收到空间报警信息,…

    数据库 2023年6月14日
    087
  • EXCLE中SUMIF和SUMIFS的用法

    一、函数的含义 1、SUMIF函数在EXCLE中是用来对指定条件对若干单元格求和; 2、SUMIFIS函数在EXCLE中是用来对一个区域内满足多重条件的单元格求和(两个条件以上);…

    数据库 2023年6月11日
    090
  • 实现随机验证码

    Java实现随机验证码的生成 随机验证码: 法一:普通方法 核心逻辑: 1.定义一个String类型的变量存储验证码字符。 2.定义一个for循环,循环n次(n为验证码的所需要字符…

    数据库 2023年6月16日
    0122
  • dockerfile

    基本结构 Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。 Dockerfile 由一行行命令语句组成,并且支持以 # 开头…

    数据库 2023年6月14日
    092
  • 对于Java循环中的For和For-each,哪个更快

    Which is Faster For Loop or For-each in Java 对于Java循环中的For和For-each,哪个更快 通过本文,您可以了解一些集合遍历技…

    数据库 2023年6月11日
    093
  • HttpServletRequest 类

    HttpServletRequest类有什么作用 HttpServletRequest 类的常用方法 如何获取请求参数 doGet 请求的中文乱码解决: POST 请求的中文乱码解…

    数据库 2023年6月11日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球