行为型模式 - 模板方法模式Template Method

2023-10-30

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

 模式的定义与特点

        模板方法(Template Method),模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重新定义该算法的某些特定步骤。它是一种类行为型模式。

该模式的主要优点如下:

  • 它封装了不变的部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  • 它在父类中提取了公共的部分代码,便于代码复用。
  • 部分方法使用子类实现,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

该模式主要缺点如下:

  • 对每个不同的实现都需要要定义一个子类,这对导致类的个数增加,系统更加庞大,设计也更加抽象,间接的增加了系统实现的复杂度。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种返乡的控制结构,他提高了代码阅读性的难度。
  • 由于继承关系自身的缺点,如果父类添加新的抽象方法,那么所有子类都需要重新改一遍。

模式的结构与实现

      模板方法模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。现在来介绍它们的基本结构。  

1. 模式的结构

模板方法模式包含以下主要角色。  

1)抽象类/抽象模板(Abstract Class)

抽象模板类,负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。  

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

② 基本方法:是整个算法中的一个步骤,包含以下几种类型。

  • 抽象方法:在抽象类中声明,由具体子类实现。
  • 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

2)具体子类/具体实现(Concrete Class)

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

模板方法模式的结构图如图 1 所示。  

图1

 

代码示例

using DesignPattern.TemplateMethodPattern;
using System;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TemplateMethodHelper();
        }

        #region Pattern - TemplateMethod
        static void TemplateMethodHelper()
        {
            TemplateMethod cola = new Cola();
            cola.HaveDrank();

            TemplateMethod juice = new Juice();
            juice.HaveDrank();

            Console.ReadLine();
        }
        #endregion
    }
}

//======================================================================================

namespace DesignPattern.TemplateMethodPattern
{
    public abstract class TemplateMethod
    {
        public void HaveDrank()
        {
            By();
            OpenBottleCap();
            Drinking();
            CloseBottleCap();

        }
        protected abstract void By();

        private void OpenBottleCap()
        {
            Console.WriteLine("打开瓶盖.");
        }

        private void Drinking()
        {
            Console.WriteLine("喝一口.");
        }

        private void CloseBottleCap()
        {
            Console.WriteLine("合上瓶盖.");
        }
    }

    public class Cola : TemplateMethod
    {
        protected override void By()
        {
            Console.WriteLine("买一瓶可乐.");
        }
    }
    public class Juice : TemplateMethod
    {
        protected override void By()
        {
            Console.WriteLine("买一瓶果汁.");
        }
    }
}


希望大家:点赞,留言,关注咯~    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

行为型模式 - 模板方法模式Template Method 的相关文章

  • 模板方法模式

    模式的结构与实现 模板方法模式需要注意抽象类与具体子类之间的协作 它用到了虚函数的多态性技术以及 不用调用我 xff0c 让我来调用你 的反向控制技术 现在来介绍它们的基本结构 1 模式的结构 模板方法模式包含以下主要角色 1 xff09
  • C++设计模式22:模板方法模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • 用Rust实现23种设计模式之 模板方法模式

    关注我 学习Rust不迷路 模板方法模式是一种行为型设计模式 它定义了一个算法的骨架 将一些步骤的实现延迟到子类中 以下是模板方法模式的优点和使用场景 优点 提高代码复用性 模板方法模式通过将算法的通用部分放在父类中 可以在子类中复用这些通
  • 模板方法模式(Template Method)

    模板方法模式 Template Method 概述 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 例如生产饮料的流程 加原料 加水 烧水
  • 行为型模式 - 命令模式Command

    模式的定义与特点 命令模式 Command Pattern 是将一个请求封装成一个对象 从而使您可以用不同的请求对客户进行参数化 命令模式是把发出命令的责任和执行命令的责任分割开 委派给不同的对象 命令模式允许请求的一方和发送的一方独立开来
  • 行为型模式 - 模板方法模式Template Method

    学习而来 代码是自己敲的 也有些自己的理解在里边 有问题希望大家指出 模式的定义与特点 模板方法 Template Method 模式的定义如下 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下
  • 【GitHubShare】Web 前后端开发、以太坊基础、智能合约、密码学、数据分析

    区块链开发指南 作者通过 NFT 进行募资 然后将资金用于激励社区创作 让参与教程编写的人都能获益 从项目创建之初 教程便一直保持开放 GitHub github com dcbuild3r blockchain development g
  • Java设计模式(十四)—— 模板方法模式

    模板方法模式是指定义一个操作中算法的骨架 而将一些步骤延迟到子类中 模板方法使子类可以不改变一个算法的结构 即可重定义该算法的某些特定步骤 适合模板方法模式的情景如下 编制一个通用算法 将某些步骤的具体实现留给子类来实现 需要重构代码 将各
  • 行为型模式 - 迭代器模式iterator

    模式的定义与特点 迭代器模式 iterator Pattern 为的提是可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象 多个对象聚在一起形成的总体称之为聚集 聚集对象是能够包容一组对象的容器对象 迭代子模式将迭代逻辑封装到一个独立的子
  • 【设计模式】 模板方法模式介绍及C代码实现

    设计模式 模板方法模式介绍及C代码实现 背景 在软件构建过程中 对于某一项任务 它常常有稳定的整体操作结构 但各个子步骤却有很多改变的需求 或者由于固有的原因 比如框架与应用之间的关系 而无法和任务的整体结构同时实现 比如你要从北京去上海出
  • 【c++设计模式】——模板方法模式

    模板方法模式的定义 定义一个操作中的算法对象的骨架 稳定 而将一些步骤延迟到子类 定义一个虚函数 让子类去实现 template method使得子类可以不改变 复用 一个算法结构即可重定义该算法的某些步骤 在理解模板方法模式的时候 我们需
  • 【githubshare】KCon 黑客大会演讲 macOS Big Sur 内核漏洞挖掘、云虚拟化安全、服务器硬件可信与安全实践

    GitHub 上一个开源资料库 KCon 黑客大会演讲 PPT 2021 年包含了 macOS Big Sur 内核漏洞挖掘 云虚拟化安全 服务器硬件可信与安全实践等内容 个开源资料库 KCon 黑客大会演讲 PPT 2021 年包含了 m
  • 模板方法模式:简化代码,提高复用性

    在软件开发中 我们经常会遇到一些算法或业务流程 其中的步骤或顺序是固定的 但某些步骤的具体实现方式可能会有所不同 这时 模板方法模式就能派上用场 模板方法模式是一种行为设计模式 它定义了一个算法的骨架 将某些步骤的具体实现延迟到子类中 通过
  • 模板方法设计模式,让我的代码更加优雅了,这一波不亏

    模板方法设计模式属于行为模式的分类 为啥要使用设计模式 使用设计模式可以重构整体架构代码 提交代码复用性 扩展性 减少代码冗余问题 让我们的代码更直观和优雅 模板方法模式和策略模式都有相同之处就是有具体的行为实现 所以也是基于工厂模式的实现
  • 【设计模式】Java设计模式——模板方法模式(Template Pattern)

    文章目录 1 介绍 1 1 定义 1 2 作用 2 模式结构 2 1 UML类图 2 2 模式组成 3 代码实例 3 1 背景 3 2 应用 4 优点 5 缺点 6 应用场景 1 介绍 1 1 定义 模板方法模式 Template Patt
  • 23种设计模式之模板方法模式

    文章目录 模板方法模式 模板方法模式的优缺点 使用场景 模板方法模式 模板方法模式法 Template Method 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
  • 模板方法(Template Method):类行为型模式

    文章目录 1 设计模式 Design Pattern 1 1 概述 1 2 分类 2 模板方法 Template Method 类行为型模式 2 1 代码示例 2 2 模板方法模式的定义 实现意图 1 设计模式 Design Pattern
  • 行为型模式 - 状态模式State

    状态模式的定义与特点 状态 State 模式的定义 对有状态的对象 把复杂的 判断逻辑 提取到不同的状态对象中 允许状态对象在其内部状态发生改变时改变其行为 状态模式是一种对象行为型模式 其主要优点如下 结构清晰 状态模式将与特定状态相关的
  • 【githubshare】无需编写一行代码,即可自动为静态数据集生成只读 API,快速完成静态数据的加载调用

    推荐 GitHub 上一款开源的开发者工具 ROAPI 无需编写一行代码 即可自动为静态数据集生成只读 API 快速完成静态数据的加载调用 GitHub github com roapi roapi 静态数据集所支持的格式 包括 CSV J
  • Java设计模式:模板方法模式

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于 Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得 关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 一 模板方法模式的定义 二 模板方

随机推荐

  • STM32----ADC模数转换与DAC数模转换

    目录 ADC模数转换 DAC数模转换 ADC模数转换 指模 数转换器或者模拟 数字转换器 将连续变量的模拟信号转换为离散的数字信号的器件 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号 特点 STM32通道组 1 规则通道
  • 采用 Nacos 和 Apollo 作为配置中心时@ConfigurationProperties、@RefreshScope的正确用法

    心中剑 手中剑 剑起 剑来 剑魂 剑起 众所周知 当前各个互联网企业采用的配置中心中 无外乎 Nacos 和 Apollo 最为知名 今天不去比较优劣 因为适合自己的才是最好的 而是在两个框架出现过渡时 有些用法或者编码习惯需要调整 否则配
  • 配置MATLAB环境

    配置MATLAB环境 MATLAB是一种强大的数值计算和科学编程环境 它提供了许多功能和工具 用于数据分析 算法开发和模型仿真 在本文中 我将详细介绍如何配置MATLAB环境 步骤1 下载和安装MATLAB 首先 您需要从MathWorks
  • 哈希表(散列表)的平均查找成功/失败长度

    计算哈希地址的方法 称之为哈希函数 常见的计算哈希地址方法有 1 直接定址法 2 除留余数法 3 数字分析法 4 平方取中法 本文所分析的是使用除留余数法计算哈希地址这类 的平均查找成功长度和查找失败长度 对于除留余数法的哈希函数 散列函数
  • GB 9706.1-2020医疗设备爬电距离和电气间隙计算实例

    GB 9706 1 2020医疗设备爬电距离和电气间隙计算实例 本文只就所示路径的爬电距离 电气间隙的计算按照GB 9706 1 2020标准进行验证 路径的符合性或在文字中加以修改 不作判定 我们先来看案例背景 有上文可知 污染等级PD2
  • linux怎吗卸载openssh,卸载并重装openssh(解决ssh -1问题)

    在集群测试过程中 有一个节点的openssh装的有问题 需要ssh 1 才能登录 导致多节点的mpi无法使用 修改配置文件什么的也没有用 也许是我改的不对 最后决定直接重装openssh 1 卸载 先查看openssh的相关包 root n
  • 内存管理单元MMU简介(只有具有MMU才支持真正的操作系统,微软,linux,unix等)

    引言 MMU Memory Management Unit 即内存管理单元 是现代CPU架构中不可或缺的一部分 MMU主要包含以下几个功能 虚实地址翻译 在用户访问内存时 将用户访问的虚拟地址翻译为实际的物理地址 以便CPU对实际的物理地址
  • socket inet_pton

    inet pton Linux下这2个IP地址转换函数 可以在将IP地址在 点分十进制 和 整数 之间转换 而且 inet pton和inet ntop这2个函数能够处理ipv4和ipv6 算是比较新的函数了 inet pton函数原型如下
  • vue 打开一个新页面_vue如何打开新窗口

    项目中需要点击打开新页面另外展示数据 在vue中如何进行的 目前我能解决的就是只有一种方案 网上说的方案没有一种成功 为何呢 最主要原因是 app中只能有路由跳转 不能再有其他内容时才会打开时是全新的一个页面 否则就会新开页面内容与APP中
  • 《Roller: Fast and Efficient Tensor Compilation for Deep Learning》

    Roller Fast and Efficient Tensor Compilation for Deep Learning 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的ke
  • 微服务链路追踪——skywalking

    前言 skywalking是分布式系统的应用程序性能监视 分布式链路追踪工具 跟听云 博瑞等一系列服务器监控组件服务类似 开源的相关类似组件有zipkin pinpoint等 由于笔者所在项目组准备升级springcloud 缺少相关链路监
  • [U3D] ShaderLab学习笔记(一) Shader的语法基础

    U3D ShaderLab学习笔记 一 Shader的语法基础 Shader的分类 Shader的代码构成 整体架构 代码分区介绍 ShaderLab的变量 基础变量类型 结构体struct 属性变量声明语法 Attribute Color
  • 【DRAM存储器四】DRAM存储器的架构演进-part1

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 参考书籍 Memory Systems Cache DRAM Disk 上篇文章我们分析了DRAM存储器的基本原理和现代DDR4的内部结构
  • 1.44寸TFT-LCD显示屏取模教程

    目录 1 软件包 点击下载 2 LCD ASCLL码取模教程 3 LCD汉字取模教程 4 LCD图片取模教程 1 软件包 点击下载 2 LCD ASCLL码取模教程 1 打开取模软件 2 左上角模式选择为字符模式 3 点击选项 4 设置如下
  • 计算机主机报警 声,电脑开机报警4声长鸣解决教程

    电脑开机报警是什么原因 首先要清理一下内存条 拆开主机后 用手指把内存插槽的卡子向两边扳动 拆除内存条 然后用橡皮筋擦擦 然后将内存条对准卡口 扶好内存条两端 稍稍用力按下安装内存条 然后开机看一下能不能启动电脑 电脑开机电脑图解 1 如果
  • 数据结构——双链表(C语言)

    目录 编辑 双链表的初始化 双链表的打印 双链表的尾插 双链表的头插 双链表的尾删 双链表的头删 双链表pos位置之前的插入 双链表pos位置的删除 关于顺序表和链表的区别 上篇文章给大家讲解了无头单向循环链表 它的特点 结构简单 一般不会
  • 69.android 简单的沉浸式状态栏,设置状态栏颜色,以及给小米手机设置状态栏文字颜色+取消状态栏,隐藏虚拟按键,并且全屏

    第一种 简单的方式 直接把状态栏顶掉 为透明色 在Activity里使用 if Build VERSION SDK INT gt Build VERSION CODES KITKAT int flagTranslucentStatus Wi
  • Spring 如何管理 bean

    本文转载自 https blog csdn net l18848956739 article details 80917853 常常听老师说容器 容器是什么 Spring 中是如何体现的 一直有疑惑 这两天看了一下Spring 管理 bea
  • python 中一维与二维数组的切片与获取元素

    1 一维数组中 def array1 arr 1 2 3 4 5 value arr 2 获取索引为2的元素 即3 print value sub array arr 1 4 获取索引从1到3的子数组 即 2 3 4 print sub a
  • 行为型模式 - 模板方法模式Template Method

    学习而来 代码是自己敲的 也有些自己的理解在里边 有问题希望大家指出 模式的定义与特点 模板方法 Template Method 模式的定义如下 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下