小谈设计模式(11)—模板方法模式

news2024/11/23 15:36:19

小谈设计模式(11)—模板方法模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 模板方法模式
    • 角色分类
      • 抽象类(Abstract Class)
      • 具体子类(Concrete Class)
      • 抽象方法(Abstract Method)
      • 具体方法(Concrete Method)
      • 钩子方法(Hook Method)
    • 核心思想
    • Java代码实现
      • 输出
      • 分析
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

模板方法模式

这是一种行为型设计模式,用于定义算法的框架,将算法的具体实现延迟到子类中。

角色分类

抽象类(Abstract Class)

抽象类定义了一个模板方法,该方法包含了算法的框架,以及一系列基本方法的调用顺序。抽象类还可以定义抽象方法、具体方法和钩子方法,用于延迟具体实现或提供默认实现。

具体子类(Concrete Class)

具体子类继承抽象类,并实现抽象方法和钩子方法。具体子类负责实现算法的具体步骤。

抽象方法(Abstract Method)

抽象方法是在抽象类中声明的方法,由具体子类实现。抽象方法是模板方法中的基本方法,用于完成算法的一部分。
在这里插入图片描述

具体方法(Concrete Method)

具体方法是在抽象类中已经实现的方法,可以在模板方法中直接调用。具体方法是模板方法中的基本方法,用于完成算法的一部分。

钩子方法(Hook Method)

钩子方法是在抽象类中有默认实现的方法,子类可以选择是否覆盖。钩子方法可以用于在算法的不同阶段提供不同的行为。
在这里插入图片描述

核心思想

将算法的框架固定在抽象类中,而将具体实现延迟到具体子类中。抽象类定义了一个模板方法,该方法包含了算法的框架,以及一系列基本方法的调用顺序。抽象类还可以定义抽象方法、具体方法和钩子方法,用于延迟具体实现或提供默认实现。

Java代码实现

// 抽象模板类
abstract class AbstractClass {
    // 模板方法,定义了算法的骨架
    public final void templateMethod() {
        step1();
        step2();
        step3();
    }

    // 基本方法1
    protected abstract void step1();

    // 基本方法2
    protected abstract void step2();

    // 基本方法3
    protected abstract void step3();
}

// 具体模板类A
class ConcreteClassA extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("ConcreteClassA: Step 1");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteClassA: Step 2");
    }

    @Override
    protected void step3() {
        System.out.println("ConcreteClassA: Step 3");
    }
}

// 具体模板类B
class ConcreteClassB extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("ConcreteClassB: Step 1");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteClassB: Step 2");
    }

    @Override
    protected void step3() {
        System.out.println("ConcreteClassB: Step 3");
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();

        System.out.println();

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

输出

ConcreteClassA: Step 1
ConcreteClassA: Step 2
ConcreteClassA: Step 3

ConcreteClassB: Step 1
ConcreteClassB: Step 2
ConcreteClassB: Step 3

分析

在上面的示例中,抽象模板类AbstractClass定义了一个模板方法templateMethod(),这个方法定义了一个算法的骨架,其中包含了多个基本方法step1()、step2()、step3()。具体模板类ConcreteClassA和ConcreteClassB继承自AbstractClass,并实现了基本方法。
在这里插入图片描述

总结

模板方法模式是一种简单但非常实用的设计模式,它通过将算法的框架固定在抽象类中,将具体实现延迟到具体子类中,提供了一种灵活而可扩展的算法设计方案。

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

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

相关文章

java复习回顾

文章目录 0 开发工具1. 对象和类、三大特性2. 成员/实例变量和实例变量(this关键字)3. 方法重载overload4. 构造方法和this关键字5. 继承6. 访问修饰符7. 方法重写8. 继承下的构造执行9. 多态9.1 向上转型9.2 向下转型9.3 多态的应用 0 开发工具 Maven是…

[DS资源推荐] Data Structure 严书配套代码

下图引入自康建伟老师博客 Github地址 使用说明:康老师博客 使用感受:Orz!非常非常非常全面!终于能看得下去严书了…

【DLoopDetector(C++)】DBow2词袋模型loop close学习

0.前言 最近读了两篇论文,论文作者开源了一种基于词袋模型DBoW2库的DLoopDetector算法,自己运行demo测试一下 对应论文介绍:Bags of Binary Words for Fast Place Recognition in Image Sequences 开源项目Github地址:https://gi…

【Java 进阶篇】JDBC Connection详解:连接到数据库的关键

在Java中,要与数据库进行交互,需要使用Java数据库连接(JDBC)。JDBC允许您连接到不同类型的数据库,并执行SQL查询、插入、更新和删除操作。在JDBC中,连接数据库是一个重要的步骤,而Connection对象…

公众号商城小程序的作用是什么

公众号是微信平台重要的生态体系之一,它可以与其它体系连接实现多种效果,同时公众号内容创作者非常多,个人或企业商家等,会通过公众号分享信息或获得收益等,而当商家需要在微信做私域经营或想要转化粉丝、售卖产品时就…

springboot和vue:十、vue2和vue3的差异+组件间的传值

首先用vue-cli创建一个vue2的项目。 vue2和vue3的差异 main.js的语法有所差别。 vue2是 import Vue from vue import App from ./App.vuenew Vue({render: h > h(App), }).$mount(#app)vue3是 import { createApp } from vue import App from ./App.vuecreateApp(App).…

【OpenMV】形状识别 特征点检测 算法的组合使用

目录 形状识别 圆形检测 矩形识别 特征点检测 算法的组合使用 形状识别 圆形 霍夫圆检测算法 通过霍夫变换查找圆,支持openmv3以上 矩形 四元检测算法 识别任意大小任意角度的矩形,四元检测算法对图像的失真,畸变没有要求,畸…

spark SQL 任务参数调优1

1.背景 要了解spark参数调优,首先需要清楚一部分背景资料Spark SQL的执行原理,方便理解各种参数对任务的具体影响。 一条SQL语句生成执行引擎可识别的程序,解析(Parser)、优化(Optimizer)、执行…

Java性能调优必备知识学习路线

性能调优是Java开发中一个非常重要的环节,它可以帮助我们提高系统的性能、稳定性、可靠性和用户体验,从而提高用户体验和企业竞争力。 目录 一、为什么要学习Java性能调优? 二、如何做好性能调优? 2.1 扎实的计算机基础 2.2 …

Acwing 143. 最大异或对

Acwing 143. 最大异或对 题目描述思路讲解代码展示 题目描述 思路讲解 这道题的启示是&#xff1a;字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字 思路:将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异. 代码展示 #include<iostream…

餐饮外卖配送小程序商城的作用是什么?

餐饮是支撑市场的主要行业之一&#xff0c;其市场规模很大&#xff0c;从业商家从大到小不计其数&#xff0c;对众商家来说&#xff0c;无论门店大小都希望不断生意增长&#xff0c;但在实际发展中却会面对不少痛点&#xff1b; 餐饮很适合线上经营&#xff0c;无论第三方外卖…

思维模型 周期

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。周期是一个看似极为简单&#xff0c;但背后却蕴藏着大智慧的模型&#xff0c;了解周期&#xff0c;对于了解王朝更替&#xff0c;数学之美&#xff0c;经济运转等都有帮助。 1 周期的应用 …

Swing程序设计(4)JLabel标签和导入图片

文章目录 前言一、JLabel标签 1.介绍2.实例展示二、JLabel中绘图和导入图片 1.自定义绘图2.导入图片总结 前言 本文介绍了Swing程序中JLabel标签的使用&#xff0c;以及在标签中导入图片和自定义图标的方法。 一、JLabel标签的使用 1.介绍 JLabel标签&#xff1a;在Swing程序中…

模拟实现map/set[改编红黑树实现map/set容器底层]

文章目录 1.搭建框架1.1map1.2set1.3RBTree1.4图解 2.代码剖析2.1RBTree.h2.2Map.h2.3Set.h2.4Test.cpp 1.搭建框架 1.1map 1.2set 1.3RBTree 1.4图解 2.代码剖析 2.1RBTree.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list&…

.net 温故知新:Asp.Net Core WebAPI 入门使用及介绍

在Asp.Net Core 上面由于现在前后端分离已经是趋势,所以asp.net core MVC用的没有那么多,主要以WebApi作为学习目标。 一、创建一个WebApi项目 我使用的是VS2022, .Net 7版本。 在创建界面有几项配置: 配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置…

YOLOv5-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv5模型训练1. 项目的克隆和必要的环境依赖1.1 项目克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改数据配置文件3.2 修改模型配置文件3.3 训练模型3.4 mAP测试 三、Y…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一排&…

基于SpringBoot的大学生租房平台

基于SpringBoot的大学生租房平台的设计与实现&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员、房东 管理员&#…

ck 计算留存

1.函数介绍 参数聚合函数 | ClickHouse Docs Retention​ 该函数将一组条件作为参数&#xff0c;类型为1到32个 UInt8 类型的参数&#xff0c;用来表示事件是否满足特定条件。 任何条件都可以指定为参数&#xff08;如 WHERE). 除了第一个以外&#xff0c;条件成对适用&…

第七章 查找 十、散列查找

一、哈希表&#xff08;散列表&#xff09; 哈希表的数据元素的关键字与其存储地址直接相关。 二、解决冲突的方法 三、散列表中元素的查找 总共对比了3个关键字&#xff0c;所以查找长度为3. 四、查找效率计算 &#xff08;1&#xff09;成功的概率 需要对比一次的关键字为…