模板方法模式(行为型)

news2024/11/15 17:46:20

目录

一、前言

二、模板模式

三、带钩子的模板模式

四、总结


一、前言

        模板方法模式是一种行为型设计模式,它定义了一个操作中的算法框架,将一些步骤延迟到子类中实现。这种模式是基于“开闭原则”的设计思想,即对扩展开放,对修改关闭。

        模板方法模式的核心思想是:定义一个抽象类,把一些抽象行为留给子类去实现,而把一些公共行为放在抽象类中实现。在模板方法模式中,抽象类中定义了一个算法框架,由具体子类来实现其中的具体步骤。

        模板方法模式一般由以下几个角色组成:

        - 抽象类(Abstract Class):定义了一个算法框架,其中包含了一些抽象的操作,由子类去实现。
        - 具体类(Concrete Class):实现了抽象类中定义的抽象方法,完成算法中的具体步骤。

        类图大致结构:

二、模板方法模式

        比如学生进行考试,每个人的试卷都是一致的,具体的不一致是每个人的答案,这时候我们可以将试卷当做一个抽象模板,每个学生的答案就是具体的一个实现。

        试卷模板类ExamPaperTemplate:

public abstract class ExamPaperTemplate {

    public abstract String Answer1();

    public abstract String Answer2();

    public abstract String Answer3();

    private void Question1(){
        System.out.println(String.format("1+1=%s", Answer1()));
    }

    private void Question2(){
        System.out.println(String.format("1+2=%s", Answer2()));
    }

    private void Question3(){
        System.out.println(String.format("1+3=%s", Answer3()));
    }

    public void TemplateMethod(){
        Question1();
        Question2();
        Question3();
    }
}

        学生StudentConcrete1、StudentConcrete2类:

public class StudentConcrete1 extends ExamPaperTemplate{
    @Override
    public String Answer1() {
        return "2";
    }

    @Override
    public String Answer2() {
        return "3";
    }

    @Override
    public String Answer3() {
        return "4";
    }
}

public class StudentConcrete2 extends ExamPaperTemplate{
    @Override
    public String Answer1() {
        return "11";
    }

    @Override
    public String Answer2() {
        return "22";
    }

    @Override
    public String Answer3() {
        return "33";
    }
}

        客户端调用类TemplateClient:

public class TemplateClient {
    public static void main(String[] args) {
        ExamPaperTemplate examPaperTemplate1 = new StudentConcrete1();
        examPaperTemplate1.TemplateMethod();

        ExamPaperTemplate examPaperTemplate2 = new StudentConcrete2();
        examPaperTemplate2.TemplateMethod();
    }

}

        运行结果:

三、带钩子的模板模式

        模板模式中还有一类是带钩子的,通过钩子,子类可以选择性对父类执行。也用之前的代码展示,只是加上钩子,具体可以理解为试卷中包含附加题,可选择不做,包含建议,可选择不写建议。

public abstract class ExamPaperTemplate {

    public abstract String Answer1();

    public abstract String Answer2();

    public abstract String Answer3();

    public abstract String Answer4();

    public abstract String Answer5();

    private void Question1(){
        System.out.println(String.format("1+1=%s", Answer1()));
    }

    private void Question2(){
        System.out.println(String.format("1+2=%s", Answer2()));
    }

    private void Question3(){
        System.out.println(String.format("1+3=%s", Answer3()));
    }

    private void Question4(){
        System.out.println(String.format("1*1=%s", Answer4()));
    }


    /**
     * 钩子方法,子类覆盖
     */
    private void Question5(){
        System.out.println(String.format("建议:%s", Answer5() == null ? "无" : Answer5()));
    }

    /**
     * 钩子方法,子类选择性执行
     */
    boolean customer(){
        return true;
    }

    public void TemplateMethod(){
        Question1();
        Question2();
        Question3();
        if (customer()){
            Question4();
        }
        Question5();
    }
}
public class StudentConcrete1 extends ExamPaperTemplate{
    @Override
    public String Answer1() {
        return "2";
    }

    @Override
    public String Answer2() {
        return "3";
    }

    @Override
    public String Answer3() {
        return "4";
    }

    @Override
    public String Answer4() {
        return null;
    }

    @Override
    public String Answer5() {
        return null;
    }

    @Override
    boolean customer(){
        return false;
    }

}

public class StudentConcrete2 extends ExamPaperTemplate{
    @Override
    public String Answer1() {
        return "11";
    }

    @Override
    public String Answer2() {
        return "22";
    }

    @Override
    public String Answer3() {
        return "33";
    }

    @Override
    public String Answer4() {
        return "1";
    }

    @Override
    public String Answer5() {
        return "题目太简单";
    }

}

public class TemplateClient {
    public static void main(String[] args) {
        ExamPaperTemplate examPaperTemplate1 = new StudentConcrete1();
        examPaperTemplate1.TemplateMethod();
        System.out.println("============");
        ExamPaperTemplate examPaperTemplate2 = new StudentConcrete2();
        examPaperTemplate2.TemplateMethod();
    }

}

        运行结果:

四、总结

        实际开发中,像Spring框架中的JdbcTemplate和HibernateTemplate就是典型的模板方法模式的应用,游戏开发中也使用得很多,比如角色的行走、攻击等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1315732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Microsoft visual studio 2013卸载方法

1、问 题 Microsoft visual studio 2013 无法通过【程序与功能】卸载 2、解决方法 使用微软的Microsoft visual studio 2013 专用卸载工具 工具下载链接:https://github.com/Microsoft/VisualStudioUninstaller/releases 或 链接:https://pan.baidu.c…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方(微服务A)服务方(微服务B) 测试测试一 ,seata发挥作用,成功回滚!测试二:处理feignclient接口的返回类型从Integer变成String,…

数理统计基础:参数估计与假设检验

在学习机器学习的过程中,我充分感受到概率与统计知识的重要性,熟悉相关概念思想对理解各种人工智能算法非常有意义,从而做到知其所以然。因此打算写这篇笔记,先好好梳理一下参数估计与假设检验的相关内容。 1 总体梳理 先从整体结…

OceanBase数据库初识

文章目录 说明分布式数据库发展发展历史OceanBase和传统数据库的对比总结 OceanBase数据库产品简介应用案例 OceanBase数据库产品OceanBase数据库内核OceanBase开发者中心(ODC)产品架构OMS核心功能简介 说明 本文仅供学习和交流学习内容参考官方的培训资…

年底了,千万不要跳槽..

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

关于Linux你必须知道的五件事

Linux是一种开源操作系统 (OS)。操作系统是直接管理系统硬件和资源(如 CPU、内存和存储)的软件。操作系统位于应用程序和硬件之间,并在所有软件和执行工作的物理资源之间建立连接。 俄罗斯军方计划用 Astra Linux 取代 Windows!为…

【数据结构】双链表的定义和操作

目录 1.双链表的定义 2.双链表的创建和初始化 3.双链表的插入节点操作 4.双链表的删除节点操作 5.双链表的查找节点操作 6.双链表的更新节点操作 7.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助…

RuoYi-Cloud诺依微服务项目

1、架构图 从图中解析出RuoYi-Cloud 使用微服务技术栈 网关:Gateway远程调用:Ribbon/Feign注册中心:Nacos Discovery熔断降级:Sentinel配置中心:Nacos Config链路追踪:Sleuth ZipKin/SkyWalking &#x…

leetcode(力扣) 89. 格雷编码 (规律题)

文章目录 题目描述思路分析完整代码 题目描述 n 位格雷码序列 是一个由 2n 个整数组成的序列,其中: 每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1) 第一个整数是 0 一个整数在序列中出现 不超过一次 每对 相邻 整数的二进制表…

vue3 使用antd 报错Uncaught TypeError--【已解决】

问题现象 使用最基本的 ant-design-vue 按钮demo 都报错 报错文字如下 Uncaught TypeError: Cannot read properties of undefined (reading value)at ReactiveEffect.fn (ant-design-vue.js?v597f5366:6693:87)at ReactiveEffect.run (chunk-K2VKR2AM.js?v25c381c3:461:…

用文本创建图表的工具PlantUML

什么是 PlantUML ? PlantUML 是一种开源工具,允许用户从纯文本语言创建图表。除了各种 UML 图之外,PlantUML 还支持各种其他软件开发相关格式,以及 JSON 和 YAML 文件的可视化。PlantUML 语言是特定领域语言的一个示例。 什么是 P…

Shopee ERP:提升电商管理效率的终极解决方案

Shopee ERP(Enterprise Resource Planning,企业资源规划)是一款专为Shopee卖家设计的集成化电商管理软件。通过使用Shopee ERP系统,卖家可以更高效地管理他们的在线商店,实现库存管理、订单处理、物流跟踪、财务管理、…

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request 错误截图: 在官方网站中,查看常见问题排查: 错误追踪: 跟着源码可以看到如下代码: 从源码中&a…

【Spring教程30】Spring框架实战:从零开始学习SpringMVC 之 Rest风格简介与RESTful入门案例

目录 1 REST简介2 RESTful入门案例2.1 环境准备2.2 思路分析2.3 修改RESTful风格 3 知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安…

我的世界合成表大全(最新完整版)

我的世界合成表配方是什么? 我的世界是一款非常有趣的高自由度的沙盒游戏,游戏中玩家可以根据合成配方制作各种各样的物品。今天小编就为大家带来我的世界合成表大全(最新完整版),希望可以帮到大家。 我的世界合成表大全(最新完整版) 基础物品合成表&a…

知识付费小程序开发:构建个性化学习平台的技术实践

随着在线学习和知识付费的兴起,开发一款知识付费小程序成为了创新的热点之一。本文将通过使用Node.js、Express和MongoDB为例,演示如何构建一个基础的知识付费小程序后端,并实现用户认证和知识内容管理。 1. 初始化项目 首先,确…

eNSP小实验(ACL和NAT)

一.ACL 实验目的:过滤流量,然后匹配规划后,判断该流量通过或拒绝 1.拓扑图 2.配置 基本ACL 其它同理配置 R1 [Huawei]sys R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]dis th [V200R003C00] # interface GigabitEthernet0/0/0 # return…

基础IO --- 下

目录 1. 理解文件系统中inode的概念 1.1. 了解磁盘 1.1.1. 认识磁盘 1.1.2. 磁盘的物理结构 1.1.3. 简单了解磁盘如何读写数据的 1.1.4. 磁头和盘面没有物理上的接触 1.1.5. 扇区的了解 1.1.6. 如何在物理上找到一个具体的扇区 1.2. 站在OS的角度看待磁盘 1.2.1. …

走进暄桐教室 一起观看暄桐同学作品及感受

暄桐是一间传统美学教育教室,创办于2011年,林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,旨在以书法为起点,亲近中国传统之美,以实践和所得,滋养当下生活。其实,暄桐教室…

Linux 系统 yum 安装 jdk1.8

1、首先检查是否存在jdk java -version上图这样就是系统没有找到已经安装的jdk 2.查看jdk版本列表 yum -y list java*执行此命令会显示所有版本 jdk 安装包 3、下载安装jdk 这里安装的是jdk1.8 yum install java-1.8.0-openjdk-devel.x86_64这里输入回车y继续安装 4、再次检…