• JAVA设计模式-模板模式


    一.概念

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    ​ 使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写);

    ​ 其实就是JAVA的继承以及抽象方法、重写覆盖的使用;

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

    二.角色

    • AbstractClass(抽象模板):定义了一个模板方法和若干抽象方法和具体方法,

    • ConcreteClass(具体模板):继承抽象模板类并实现抽象方法

    三.优缺点

    1.优点
    • 封装不变部分,扩展可变部分。
    • 提取公共代码,便于维护。
    • 行为由父类控制,子类实现。
    2.缺点
    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    四.适用场景

    • 多个子类有公有的方法,而且逻辑基本相同时.

    • 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现.

    • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,庵后通过函数约束其行为。

    五.模板模式实现

    1.场景

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

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

    2.创建一个抽象类

    它的模板方法被设置为 final。

    1. public abstract class Game {
    2. abstract void initialize();
    3. abstract void startPlay();
    4. abstract void endPlay();
    5. //模板
    6. public final void play(){
    7. //初始化游戏
    8. initialize();
    9. //开始游戏
    10. startPlay();
    11. //结束游戏
    12. endPlay();
    13. }
    14. }
    3.创建扩展的子类
    Cricket 类
    1. public class Cricket extends Game {
    2. @Override
    3. void endPlay() {
    4. System.out.println("Cricket Game Finished!");
    5. }
    6. @Override
    7. void initialize() {
    8. System.out.println("Cricket Game Initialized! Start playing.");
    9. }
    10. @Override
    11. void startPlay() {
    12. System.out.println("Cricket Game Started. Enjoy the game!");
    13. }
    14. }
    Football 类
    1. public class Football extends Game {
    2. @Override
    3. void endPlay() {
    4. System.out.println("Football Game Finished!");
    5. }
    6. @Override
    7. void initialize() {
    8. System.out.println("Football Game Initialized! Start playing.");
    9. }
    10. @Override
    11. void startPlay() {
    12. System.out.println("Football Game Started. Enjoy the game!");
    13. }
    14. }
    4.测试
    1. public class TemplatePatternDemo {
    2. public static void main(String[] args) {
    3. Game game = new Cricket();
    4. game.play();
    5. System.out.println();
    6. game = new Football();
    7. game.play();
    8. }
    9. }

  • 相关阅读:
    ​最新Xcode9 无证书真机调试流程
    【Vue 基础知识】v-for的使用和注意事项
    羧酸研究:Lumiprobe 磺基花青7二羧酸
    C++ 11 右值与完美转发
    php实战案例记录(15)获取GET和POST请求参数
    抖音矩阵系统,抖音矩阵系统源码,抖音SEO源码独立部署。
    <Linux复习>git基本使用
    Linux 文件创建、查看
    语音芯片NRK3302 在按摩仪上的应用
    js回调函数
  • 原文地址:https://blog.csdn.net/qq_45443475/article/details/133786196