2022-09-19 23:19阅读: 29评论: 0推荐: 0

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();      
             }
          }
          

          输出结果:

          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协议进行许可。转载请署名作者且注明文章出处。

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

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

          号外!号外!

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

          Java技术债务

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

          一键四连,你的offer也四连

          posted @   Java技术债务  阅读(29)  评论(0编辑  收藏  举报
          点击右上角即可分享
          微信分享提示
          💬
          评论
          📌
          收藏
          💗
          关注
          👍
          推荐
          🚀
          回顶
          收起
          1. 1 404 not found REOL
          404 not found - REOL
          00:00 / 00:00
          An audio error has occurred.