模板方法模式(行为型)

目录

一、前言

二、模板模式

三、带钩子的模板模式

四、总结


一、前言

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

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

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

        - 抽象类(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就是典型的模板方法模式的应用,游戏开发中也使用得很多,比如角色的行走、攻击等操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity动画】综合案例完结-控制角色动作播放+声音配套

这个案例实现的动作并不复杂,主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下: 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…

数据挖掘-08-基于Python实现时间序列分析建模(ARIMA 模型)(包括数据和代码)

文章目录 0. 数据代码下载1. 背景描述2. 预测目的3. 数据总览4. 数据预处理4.1数据描述性统计与清洗a. 导入程序库b. 读取数据c. 查看统计信息和空值d. 查看是否有重复数据以及清理重复数据e. 空值清理f. 针对清洗后的数据进行统计分析 5. 探索性数据分析5.1 数据分析 6. 构建 …

【2023年公司智能工具降本增效分享总结】「智能工具的力量」总结分享我司通过AI提升软件开发效率与质量调研报告,问题踩坑之路

调研背景 人工智能(AI)已经成为当今科技发展的主要驱动力之一,AI在多个领域取得了显著的成果,包括软件开发。AI技术的应用可以帮助开发者提高代码质量、减少错误、优化资源和时间管理,从而提高软件开发效率。 调研目…

Knowledge Graph知识图谱—9. Knowledge Modeling

9. Knowledge Modeling & Ontology Engineering How should the knowledge in a KG be modeled? – Which classes of entities do we have? – Which relations connect them? – Which constraints hold for them? → these questions are defined in the ontology …

javacv的视频截图功能

之前做了一个资源库的小项目,因为上传资源文件包含视频等附件,所以就需要时用到这个功能。通过对视频截图,然后作为封面缩略图,达到美观效果。 首先呢,需要准备相关的jar包,之前我用的是低版本的1.4.2&…

速学数据结构 | 树 森林 二叉树 的概念详讲篇

🎬 鸽芷咕:个人主页 🔥 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 📋 前言 🌈hello! 各位宝子们大家好啊,关于线性表我们已经在前面更新完了…

【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数(1)头文件(2)函数原型 2. join() 函数(1)头文件(2)函数原型 3. detach() 函数(1)头…

扫描电镜中的信号-噪声比(SNR)参数如何优化

在扫描电镜(SEM)中,信号-噪声比(SNR)的优化对于获得高质量的图像和可靠的数据分析至关重要。以下是一些优化SNR的方法: 选择适当的检测器:SEM通常配备了不同类型的检测器,如二次电子…

紫光展锐T820与飞桨完成I级兼容性测试 助推端侧AI融合创新

近日,紫光展锐高性能5G SoC T820与百度飞桨完成I级兼容性测试(基于Paddle Lite工具)。测试结果显示,双方兼容性表现良好,整体运行稳定。这是紫光展锐加入百度“硬件生态共创计划”后的阶段性成果。 本次I级兼容性测试完…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书,它允许一个证书同时保护多个域名,并且不限制域名的类型,可以保护多个域名和子域名,确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢?今天就随S…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移…

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:…

计算三叉搜索树的高度 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 定义构造三又搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于节点的数加…

网络(九)CanSM及达芬奇配置

【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块-CSDN博客 上链接讲的非常好。 CanSM提供的函数。 C CanSM使用的函数:

当你打开终端并输入命令时会发生什么?(下)

哈喽大家好,我是咸鱼 我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?(上)》的内容 终端设备是由电传打字机演变过来的,电传打字机通过物理线与大型计算机连接在一块来实现输入输出 如上图,分别是二…

【高效开发工具系列】DataGrip入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,按键、无源蜂鸣器等。 主要功能: 系统运行后,数码管默认显示第一种门铃音调,可通过K1键切…

对不起,必须放弃SQL!

尽管SQL很受欢迎,也很成功,但它又总是充斥着种种矛盾。 SQL可能笨拙又冗长,但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时,它可以快如闪电,当查询出错时,它就会慢如…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…