设计模式-模板方法模式

解决linux 2.5G网卡驱动问题 解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自 阅读详情

概述:


定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些特定步骤。

模板方法非常常见,对创建框架来说,由框架控制如何做事情,而由你(使用这个框架的人)指定框架算法中每个步骤的细节。(可以想想单元测试的框架JUnit的实现。)

模式中的角色:


  1. 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
  2. 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

模板方法模式代码实现(Java):


举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。

package com.template.pattern;

/**
 * 抽象类AbstractClass
 */
public abstract class AbstractPerson {
    // 抽象类定义整个流程骨架
    public void prepareGotoSchool() {
        dressUp();
        eatBreakfast();
        takeThings();
    }

    // 以下是不同子类根据自身特性完成的具体步骤
    protected abstract void dressUp();

    protected abstract void eatBreakfast();

    protected abstract void takeThings();
}

package com.template.pattern.vo;

import com.template.pattern.AbstractPerson;

/**
 * 具体类ConcreteClass:学生
 */
public class StudentVo extends AbstractPerson {
    @Override
    protected void dressUp() {
        System.out.println("穿校服");
    }

    @Override
    protected void eatBreakfast() {
        System.out.println("吃妈妈做好的早饭");
    }

    @Override
    protected void takeThings() {
        System.out.println("背书包,带上家庭作业和红领巾");
    }
}

/**
 * 具体类ConcreteClass:老师,做的事情不一样,但是步骤(模版方法)一样
 */
public class TeacherVo extends AbstractPerson {
    @Override
    protected void dressUp() {
        System.out.println("穿工作服");
    }

    @Override
    protected void eatBreakfast() {
        System.out.println("做早饭,照顾孩子吃早饭");
    }

    @Override
    protected void takeThings() {
        System.out.println("带上昨晚准备的考卷");
    }
}

/**
 * Main方法
 */
public class MainMethod {

    /**
     * 调用
     */
    public static void main(String[] args) {
        System.out.println("学生:");
        StudentVo sVo = new StudentVo();
        sVo.prepareGotoSchool();
        // ---------------------------
        System.out.println("老师:");
        TeacherVo tVo = new TeacherVo();
        tVo.prepareGotoSchool();

        // 或者
        // AbstractPerson aSVo = new StudentVo();
        // aSVo.prepareGotoSchool();
        // AbstractPerson aTVo = new TeacherVo();
        // aTVo.prepareGotoSchool();
    }
}

对模板方法进行挂钩:


钩子(hook)是一种被声明在抽象类中的方法,但只有空的或者默认的实现。

钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

某些步骤是可选的,所以可以将这些步骤实现成钩子,而不是实现成抽象方法,这样就可以让抽象类的子类的负荷减轻。

比如,也可以利用钩子做条件控制,影响抽象类中的算法流程:钩子方法在抽象类中有默认实现返回true,放在抽象类的if条件语句中,子类可以覆盖也可以不覆盖这个钩子方法。

具体实现可以参考下面的url,就是写了个方法,返回true,false,表示是否执行某个方法,进行判断

JUnit中的模板方法模式体现:


以JUnit3为例,JUnit3中,所有的测试类都要继承于TestCase,这个基类中规定了方法调用的顺序,所以每次测试时都是先执行setUp(),再执行测试方法,最后执行tearDown()。

可以查看JUnit3的源代码:

/**
 * Runs the bare test sequence.
 * @exception Throwable if any exception is thrown
 */
public void runBare() throws Throwable{
    setUp();
    try{
        runTest();
    } finally {
        tearDown();
    }
}

模式总结


  1. 优点
    • 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
    • 子类实现算法的某些细节,有助于算法的扩展。
    • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
    • ——————————————————————–
    • 容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。
    • 便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。
    • 比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。
  2. 缺点
    • 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
  3. 适用场景
    • 在某些类的算法中,用了相同的方法,造成代码的重复。
    • 控制子类扩展,子类必须遵守算法规则。

代码下载


模板模式TemplatePattern - 8KB


参考:
- http://www.cnblogs.com/mengdd/archive/2013/04/14/3020577.html
- http://www.cnblogs.com/mengdd/archive/2013/05/04/3059706.html
- http://rjx2008.iteye.com/blog/340362
- http://blog.youkuaiyun.com/zhengzhb/article/details/7405608


脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维 本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。 阅读详情

相关推荐

本届挑战赛亚军方案:基于大模型和多AGENT协同的运维

我们分别构建了异常检测基础模型,一旦系统接受到异常即会通知LLM主管Agent,主管Agent对异常问题进行决策与子领域Agent进行桥接,多个子领域Agent协同工作,实现运维故障自动诊断和多个任务模型的编排,提升运维效率。

weixin_52705010的博客 2292

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。

一个本科小生的奋斗史 4万+

【数据中台】数据中台架构搭建百科全书

0、前言 当前,大部分企业不再建设从源数据采集到分析应用的烟囱式系统,更倾向于数据集中采集、存储,并应用分层建设。这种方式一方面有利于应用系统的快速部署,另一方面也保证了数据的集中管理与运营,体现数据的资产、资源属性。 数据中台的出现弥补了数据开发和应用开发之间由于开发速度不匹配而出现的响应力不足等缺陷问题。 数据中台是国内学者提出的概念,起始于阿里的“大中台、小前台”概念。阿里的中台是从管理的角度出发,以中台事业部集中数据搜索,技术及产品,数据共享等多个部门的功能。其他组织或企业建设数据中台不一定需

Sunny的专栏 8405

设计模式之-模板方法模式

角色 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法 举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。 抽象类Ab

移动互联网开发者 583

深入探讨 VQ-VAE:理解变分量化自动编码器

VQ-VAE代表"Variational Quantized Variational Autoencoder",是一种生成模型,通常用于处理高维数据,如图像和音频。它的设计灵感来自于变分自动编码器(VAE)和量化方法,结合了它们的优点,使得 VQ-VAE 能够生成高质量的数据,并在数据表示上引入离散性。VQ-VAE 是一种强大的生成模型,结合了变分自动编码器和量化方法的优点。它在图像和音频生成、数据压缩和生成性对抗网络等领域具有广泛的应用。

DeepViewInsight的博客 7015

MT 103 Single Customer Credit Transfer单笔客户转账

MT 103 Single Customer Credit Transfer单笔客户转账 MT103电文能通过三种方式交换,依赖电文使用的业务场景。 (1)   核心MT103电文是一个通用电文,发送和接收此电文不需要在电文用户组(MUG)注册。允许使用所有MT103电文域来交换单客户转账,除了77T域(信封内容)。MT103电文如果是根据预先约定的双边/多边规则的格式,则可以直通处理。 (

shuytu 1万+

设计模式(个人理解版)

创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式:共7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式 行为型模式:共11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器 ———————————————— 工厂方法:接口:汽车工厂 实现类:宝马工厂、奔驰工厂 抽象工厂:接口:发动机 实现类:发动机A 发动机B 接口:空调 实现类:空调A 空调B 接口:工

kanseu的博客 172

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

java设计模式-模板方法

模板方法指的是,定义一个操作中的算法骨架,将一些操作步骤延伸到子类中。模板方法就是将在不改变算法骨架的前提下而修改子类方法达到修改算法骨架 比如在塑料板上写字后挖空,在使用毛笔或者色笔填空挖空部分。 下面我们用例子说明模板方法:

一个菜鸟的学习之路 545

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 239

【AI智能体】Dify 搭建发票识别助手操作实战详解

Dify 搭建发票识别专属助手操作实战详解

congge 5549

junit源码学习-交织的TestCase和TestResult

TestCase中实例化了TestResult,并将自身化为参数调用TestResult的run方法 TestCase.java/**  * Creates a default TestResult object  * 生成TestResult实例,单独开方法的原因我猜是有可能使用者自己继承或者实现TestCase和TestResult,  * 那么直接重写这个方法就行了  * @

songry的专栏 3202

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1570

设计模式-模板方法模式-Template Method Pattern

首先,我们定义一个模板基类,其中包含模板方法和一些虚函数,这些虚函数将在派生类中被重写。// 模板基类public:// 模板方法step1();step2();step3();protected:// 抽象步骤,子类必须实现创建一个抽象基类,它定义了模板方法和算法的框架。模板方法:一个或多个步骤组成的算法,这些步骤通过调用抽象操作来执行。抽象操作:定义为纯虚函数(pure virtual functions),子类必须实现这些函数。

wesigj的博客 1290

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【设计模式】——模板方法模式(Template Method Pattern)

模板方法模式通过定义一个算法的骨架,允许子类在不改变算法结构的前提下,通过重写某些步骤的具体实现来定制算法的行为。这种模式提高了代码的复用性和可维护性,使得算法的结构更加清晰,同时也便于扩展和维护。在C++中,模板方法模式是一种非常实用的设计模式,通过它我们可以构建出灵活且易于扩展的软件系统。

J^T的博客 1037

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

23种设计模式之模板方法模式(Template Method Pattern)

假设我们要实现一个对一个数组进行排序的程序,我们可以定义一个抽象类 ArraySorter,其中包含一个模板方法 sort,这个方法包含以下步骤:检查数组是否为空、确定排序算法、调用具体的排序算法。在模板方法模式中,我们通常会定义一个抽象类,它包含了一个模板方法和一些抽象方法,这些抽象方法通常由子类来实现。这样,就可以将算法的公共部分放在抽象类中实现,避免了大量的重复代码,并且能够根据需要灵活地选择不同的排序算法。💕欢迎大家:这里是优快云,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘。

小威的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java设计模式——模板方法模式【Template Method Pattern】

Java设计模式、模板方法模式、Template Method Pattern

scorpio的博客 3万+

设计模式教程:模板方法模式(Template Method Pattern)

定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。通过模板方法,子类可以重新定义算法中的某些步骤,而无需改变算法的结构。

遇见伯灵说的博客 1378

设计模式 -- 模板方法模式(Template Method Pattern)

定义一个操作的算法框架,而将具体实现延迟到子类中进行,使得子类在不改变整体算法框架的基础上,可以自定义算法实现。 应用场景 多个子类有公有的方法,并且逻辑基本相同时。 重要复杂的算法可以把核心算法设计为模板方法,具体细节则由子类实现 重构代码时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。 ① 模板方法:定义了算法的骨架,按某种顺序调用其包

魔法师之家 897

设计模式(十四)——模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern) 基本介绍 模板方法模式是编程中经常用得到模式。它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。 核心 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用模板方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类中...

Duktig的博客 359

23种设计模式——模板方法模式(Template Method Pattern)详解

本文介绍23种经典设计模式之——模板方法模式(Template Method Pattern)的介绍及使用

Meteors.的博客 826

设计模式-20模板方法模式Template Method Pattern

模板方法模式是一种行为设计模式,它定义算法框架,将可变步骤延迟到子类实现。该模式通过抽象类定义算法骨架(模板方法),其中包含固定步骤和抽象/钩子方法。子类重写这些方法以改变特定步骤,而不修改算法结构。适用于有相同流程但部分步骤不同的场景,如数据处理、文档生成等。优点包括避免代码重复、提高复用性、便于扩展,但可能增加系统复杂度。典型实现包含抽象类定义模板方法和步骤,具体子类实现可变部分。

d3y1`5 81_09 814

Java设计模式 二十 模板方法模式 (Template Method Pattern)

模板方法模式通过定义算法的框架,将部分步骤的实现推迟到子类,使得子类能够在不改变算法结构的前提下,定制某些具体步骤。它是一个非常适用于处理具有固定执行顺序的算法的设计模式。模板方法模式提高了代码复用性和扩展性,但同时也带来了继承关系的复杂化,需要在合理的场景下使用。

空 979

Java设计模式之模板方法模式(Template Method Pattern)

假设需要实现制作茶和咖啡的流程,两者步骤类似(烧水、冲泡、倒入杯子),但具体冲泡方法和添加调料不同。:框架定义通用流程,允许用户自定义部分步骤(如Servlet生命周期、JUnit测试流程)。:当多个类有相似的流程,但某些步骤实现不同时(如数据处理流程、文件解析流程)。:适用于具有固定流程但部分步骤需要定制的场景,如框架扩展、多态流程处理。,用于定义算法的骨架,将某些步骤的具体实现延迟到子类中。:通过父类定义算法流程,子类灵活实现具体步骤,实现代码复用和流程控制。方法为模板方法,由框架调用。

guanxin0206的博客 672

JAVA设计模式之 模板方法模式【Template Method Pattern】

一、概述 二、适用chuangk

小吕丶Code阶区 3480

设计模式精讲 Day 22:模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的框架,并在该框架中调用一些抽象方法或钩子方法,由子类来实现这些方法。这样,算法的结构保持不变,但具体的实现可以由不同的子类进行定制。模板方法模式的核心思想是将算法的骨架定义在父类中,将具体步骤延迟到子类中实现。通过模板方法,可以统一算法的执行流程,同时允许子类灵活调整部分步骤。模板方法模式适用于具有固定流程但部分步骤需定制的场景。通过完整 Java 示例,展示了模板方法模式的实现方式和实际应用。

在未来等你的专栏 1396
上一篇: 设计模式-工厂模式
下一篇: Android 视频裁剪自定义 View
「已注销」
博客等级 码龄11年 14粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值