• 23种设计模式之模板模式



    Java技术债务

    概述

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

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

    模版模式的优缺点

    优点

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

    缺点

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

    模版模式的使用场景

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

    模板模式的结构和实现

    模式结构

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

    第一部分是抽象父类

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

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

    模式实现

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

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

    Java技术债务

    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();      
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    输出结果:

    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
    • 4
    • 5
    • 6
    • 7

    总结

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

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

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

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

    更多请移驾。。。

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

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

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

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

    号外!号外!

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

    Java技术债务

    • 喜欢就收藏
    • 认同就点赞
    • 支持就关注
    • 疑问就评论

    一键四连,你的offer也四连

  • 相关阅读:
    北斗卫星:助力森林病虫害防治监测的革新技术
    [GHCTF 2024 新生赛]ezzz_unserialize
    如何在C#中解析Excel公式
    Linux常用命令、Xshell使用总结
    GB28181学习(八)——历史视音频的回放
    创建python虚拟环境
    #每日一题合集#牛客JZ3-JZ12
    leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)
    gdb调试常见命令详细总结
    [需求管理-4]:需求分析全过程:需求分析+资源评估+项目计划
  • 原文地址:https://blog.csdn.net/qq_40124555/article/details/126131599