设计模式之模板模式

        模板模式(Template Method Pattern)是行为设计模式之一,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,从而达到复用算法框架和特定步骤定制化的目的。

详细介绍

        模板模式通过把不变的行为搬移到超类,去除子类中的重复代码,提供一个固定的执行框架。这个框架由一个抽象类实现,其中定义了一个或多个抽象方法,这些抽象方法由子类具体实现,同时定义了一个模板方法,用于调用这些抽象方法,从而实现特定的业务逻辑流程。

使用场景

  1. 多个子类有共有的操作序列,但其中部分步骤的具体实现不同。
  2. 需要控制子类扩展的方式,确保子类在扩展时遵循一定的逻辑结构。
  3. 想要利用多态来避免代码重复,同时保持代码的结构清晰。

注意事项

  • 避免过度设计:确认模式适用性,避免为简单的逻辑引入不必要的复杂度。
  • 抽象类的设计:确保抽象类中的模板方法定义了清晰的操作流程,且抽象方法的粒度适中,既不过于细化也不过于笼统。
  • 子类实现的约束:明确哪些方法是必须实现的(通常是抽象方法),并考虑是否需要提供默认实现以简化子类的编写。

优缺点

优点

  • 代码复用:共享相同的算法结构,减少代码重复。
  • 扩展性好:新增子类时,只需实现特定的方法,无需修改模板方法,符合开闭原则。
  • 提高代码可读性和维护性:模板方法定义了高层逻辑,使得业务流程更清晰。

缺点

  • 过度依赖抽象:如果抽象类发生变化,可能需要修改所有子类。
  • 设计复杂度增加:增加了类之间的耦合,尤其是当抽象类和子类之间的关系变得复杂时。

Java代码示例

abstract class AbstractClass {
    public final void templateMethod() {
        stepOne();
        stepTwo();
        stepThree();
    }

    protected abstract void stepTwo();

    private void stepOne() {
        System.out.println("执行模板方法的第一个步骤");
    }

    private void stepThree() {
        System.out.println("执行模板方法的第三个步骤");
    }
}

class ConcreteClassA extends AbstractClass {
    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassA 实现的第二个步骤");
    }
}

class ConcreteClassB extends AbstractClass {
    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassB 实现的第二个步骤");
    }
}

public class TemplatePatternDemo {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();

        AbstractClass classB = new ConcreteClassB();
        classB.templateMethod();
    }
}

可能遇到的问题及解决方案

  • 问题:随着子类增多,抽象类可能变得庞大且难以维护。
    • 解决方案:考虑使用接口和组合而非继承,或者进一步抽象出更多的抽象类来分解职责。

与其他模式的对比

  • 与策略模式:两者都涉及委托给子类实现,但模板模式强调的是算法的整体结构固定,变化点在于具体步骤;而策略模式则完全将算法的实现交由子类,更侧重于算法的完全可替代性。
  • 与工厂方法模式:工厂方法关注对象创建过程的抽象和推迟,而模板方法关注算法结构的固定与步骤的延迟实现,两者解决的问题域不同。

模板模式通过提供一个固定的执行框架,有效减少了代码重复,提升了代码的组织性和可维护性,是处理一系列相似操作时的一个有力工具。

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

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

相关文章

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻,事实上,从结果思考,最后只会有三种:1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么,根据打家劫舍1中的算法 我们能算出在i…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao),为了在即将到来的英语的quiz中不挂科,gzp废寝忘食复习英语附录单词…

PAT (Advanced Level) - 1006 Sign In and Sign Out

模拟 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int m; string open_id, open_time; string close_id, close_time;int main(){cin >> m;for (int i 0; i < m; i ) {string id, in_time, out_time;cin …

深度学习:基于Keras,使用长短期记忆人工神经网络模型(LSTM)对股票市场进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Unity开发一个FPS游戏之四

在前面的系列中&#xff0c;我已介绍了如何实现一个基本的FPS游戏&#xff0c;这里将继续进行完善&#xff0c;主要是增加更换武器以及更多动作动画的功能。 之前我是采用了网上一个免费的3D模型来构建角色&#xff0c;这个模型自带了一把AR自动步枪&#xff0c;并且自带了一些…

链表经典面试题上

目录 创作不易&#xff0c;如若对您有帮助&#xff0c;还望三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 题目一&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目二&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff…

电脑如何查看一段时间内是否被人使用过?

前言 有时候我们可能会担心别人未经许可使用我们的电脑。为了确保自己不在场时电脑是否被使用过&#xff0c;以下两种方法可能会帮到你 第一种方法 WinX打开事件查看器。像WinX能快速打开很多东西&#xff0c;比如安装的应用(可以进行软件的删除)&#xff0c;设备管理器&…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具&#xff0c;用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输&#xff0c;并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

什么是发售?

什么是发售? 很多人不知道什么是发售,因为这个词刚被广而告之,在这里普及一下什么是发售? 发售,它是通过一套流程,把你的产品疯狂大卖的一种技术。通常有三个步骤,就是造势、预售、发售。那么这三个词怎么理解呢? 第一步:造势 造势的核心是引发关注,但是不做销售…

【机器视觉】Segment Anything模型(SAM) C# 推理

Facebook开源的Segment Anything是一个基于大型预训练模型的计算机视觉工具&#xff0c;它使用一种新的范式来处理图像分割任务。这个范式不依赖于传统的预训练加微调&#xff08;pretrainfinetune&#xff09;方法&#xff0c;而是通过提示&#xff08;prompt&#xff09;加上…

关于我转生从零开始学C++这件事:升级Lv.10

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 盘古开天辟地&#xff0c;大伟五一更新。大家好哇&#xff0c;大伟今天继续给大家来更新我们的C&#xff1a;…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

MATLAB 代数

MATLAB 代数 到目前为止&#xff0c;我们已经看到所有示例都可以在MATLAB及其GNU&#xff08;也称为Octave&#xff09;中运行。但是&#xff0c;为了求解基本的代数方程&#xff0c;MATLAB和Octave几乎没有什么不同&#xff0c;因此我们将尝试在单独的部分中介绍MATLAB和Octa…

【linuxC语言】获取进程信息

文章目录 前言一、getrusage函数二、示例代码总结 前言 在Linux环境下&#xff0c;了解和获取进程的信息对于系统监控、性能优化以及调试等任务至关重要。C语言作为Linux系统编程的主要语言之一&#xff0c;提供了丰富的系统调用和库函数&#xff0c;可以帮助我们轻松地获取进…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代&#xff0c;机器学习以其强大的学习和预测能力&#xff0c;成为了推动科技进步的重要力量。而在机器学习的背后&#xff0c;数学原理&#xff0c;尤其是导数的应用&#xff0c;为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

职场商务口才能力精品课

职场商务口才能力精品课&#xff08;3篇&#xff09; 以下是关于职场商务口才能力的三篇精品课内容概述&#xff1a; **篇&#xff1a;基础篇——商务口才的基石 课程主题&#xff1a;商务口才的基础技能与心态建设 内容概要&#xff1a; 商务口才的重要性&#xff1a;首先强…

告别JSON慢时代!Msgpack:数据传输界的隐秘加速器 eksposed!

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ThreeJS:坐标辅助器与轨道控制器

ThreeJS与右手坐标系 使用ThreeJS创建3D场景时&#xff0c;需要使用一个坐标系来定位和控制对象的位置和方向。 ThreeJS使用的坐标系是右手坐标系&#xff0c;即&#xff1a;X轴向右、Y轴向上、Z轴向前&#xff0c;如下图所示&#xff0c; ThreeJS-右手坐标系 Tips&#xff1a;…

鸿蒙学习1概况

鸿蒙学习1相关概念 前言相关概念Stage 模型1. AbilityStage2. UIAbility组件和ExtensionAbility组3. WindowStage4. Context 事件传递UIAbility组件与UI的数据同步UIAbility组件间交互&#xff08;设备内&#xff09; 进程模型线程模型 前言 有时间多看官网&#xff0c;官网的…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…