行为设计模式 -模板方法模式- JAVA

模板方法模式

    • [一 .简介](#一 .简介)
    • [二. 案例](#二. 案例)
      • [2.1 抽象类(Abstract Class)](#2.1 抽象类(Abstract Class))
      • [2.2 具体子类(Concrete Class)](#2.2 具体子类(Concrete Class))
      • [2.3 测试](#2.3 测试)
    • [三. 结论](#三. 结论)
      • [3.1 优缺点](#3.1 优缺点)
      • [3.2 适用场景](#3.2 适用场景)
      • [3.3 要点](#3.3 要点)

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一 .简介

模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根并将某些实现步骤推迟到子类。

百度百科: 模板方法模式定义了一个 算法的步骤,并允许子类别为 一个或多个步骤提供其实践方式。让子类别在不改变算法架构**的情况下,重新定义算法中的某些步骤。

理解: 在面向对象程序设计过程中,我们常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序 ,但某些步骤的具体实现 还未知,或者说某些步骤的实现与具体的环境相关

通俗理解,就是设计构建一个对象 的时候,类的步骤 已经固定了,可是某些类的实现逻辑 没固定,就将这些实现给子类去做。

让我们通过一个例子来理解这个模式,假如我们想建造房子 ,建造房子需要步骤是: 打地基(Foundation),立柱子(Pillars),砌墙(wall),和安装窗户(window) 。我们没办法更改这个执行步骤,因为只能完成前一步才能进行下一步。如果我想建造一个木房子(Wooden)和一个玻璃房子(glass)地基的实现 都是一样的。因此,针对这种情况我们可以创建一个模板方法,然后通过继承这个模板方法,实现对应的子类去建造不同的房子。接下来通过代码来加深理解

模板方法(Template Method)模式包含以下主要角色:

  • 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。

    • 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

    • 基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:

      • 抽象方法(Abstract Method) :一个抽象方法由抽象类声明、由其具体子类实现。

      • 具体方法(Concrete Method) :一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。

      • 钩子方法(Hook Method) :在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

        一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型。

  • 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。

二. 案例

2.1 抽象类(Abstract Class)

定义模板方法

java 复制代码
/**
 * @author chenyunzhi
 * @date 2024/6/4 13:48
 * @Description 房子模板
 */
public abstract class HouseTemplate {

    /**
     * 定义构建房子步骤  final定义防止子类重写
     */
    public final void buildHouse() {
        // 地基
        foundation();
        // 柱子
        pillars();
        // 墙
        wall();
        // 窗户 默认玻璃
        window();
        System.out.println("房子搭建成功");
    }

    /**
     * 写成私有的防止被子类重写
     */
    private void foundation() {
        System.out.println("地基已经打好");
    }

    public abstract void pillars();

    public abstract void wall();

    public void window() {
        System.out.println("玻璃窗户");
    }
    
}

2.2 具体子类(Concrete Class)

木头房子

java 复制代码
/**
 * @author chenyunzhi
 * @date 2024/6/4 13:55
 * @Description
 */
public class WoodenHouse extends HouseTemplate{
    @Override
    public void pillars() {
        System.out.println("木头柱子弄好了");
    }

    @Override
    public void wall() {
        System.out.println("木头墙壁弄好了");
    }
    @Override
    public void window() {
        System.out.println("木头窗户弄好了");
    }
}

玻璃房子

java 复制代码
/**
 * @author chenyunzhi
 * @date 2024/6/4 13:59
 * @Description 玻璃房子
 */
public class GlassHouse extends HouseTemplate{
    @Override
    public void pillars() {
        System.out.println("玻璃柱子弄好了");
    }

    @Override
    public void wall() {
        System.out.println("玻璃墙壁弄好了");
    }
}

2.3 测试

搭建木头房子和玻璃房子

java 复制代码
/**
 * @author chenyunzhi
 * @date 2024/6/4 13:58
 * @Description
 */
public class TemplateMethodPatternTest {
    public static void main(String[] args) {
        System.out.println("------------搭建木头房子-----------");
        WoodenHouse woodenHouse = new WoodenHouse();
        woodenHouse.buildHouse();

        System.out.println("------------搭建玻璃房子-----------");
        GlassHouse glassHouse = new GlassHouse();
        glassHouse.buildHouse();

    }
}

这样我们就能够基于模板去修改子类去搭建我们的房子了

三. 结论

3.1 优缺点

优点:

  • 提高代码复用性

    将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。

  • 实现了反向控制

    通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 ,并符合"开闭原则"。

缺点:

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

3.2 适用场景

  • 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

3.3 要点

  1. 模板方法应该由某些步骤组成,这些步骤的顺序是固定的,并且某些方法需要不同的实现。模板方法应该是final。
  2. 如果您希望某些方法不被覆盖,您可以将它们设为 Final或者private

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

相关推荐
李少兄1 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝1 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖1 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人1 小时前
java9新特性详解与实践
java·后端·面试
cg50172 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选3 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西3 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea