首页 > 其他分享 >设计模式之 模板方法模式

设计模式之 模板方法模式

时间:2024-11-22 18:14:17浏览次数:3  
标签:子类 模式 算法 设计模式 方法 public 模板

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。

模板方法模式的核心在于:

  • 封装算法的骨架:通过父类中的模板方法定义算法的执行顺序和框架,保证算法结构的一致性。
  • 委派细节实现:通过抽象方法的方式,允许子类根据自己的需求来提供具体实现,增强了算法的灵活性。

一、模板方法模式的结构

模板方法模式的核心是一个“模板方法”,它通常是一个在父类中定义的具体方法,里面包含了步骤的调用,而步骤的具体实现交给子类。下面是模板方法模式的基本结构:

  1. 抽象类(Abstract Class)

    定义一个模板方法,包含了算法的框架。模板方法通常是具体的方法,它调用一些抽象方法,并通过这些抽象方法将某些步骤的实现委托给子类。
    声明一些抽象方法,这些方法将由子类具体实现,代表算法中的具体步骤。
  2. 具体类(Concrete Class)

    实现抽象类中的抽象方法,提供每个步骤的具体实现。
  3. 模板方法(Template Method)

    在抽象类中定义的具体方法,它为整个算法提供了固定的执行流程和框架。子类可以在模板方法的框架中执行其特定的步骤。

二、模板方法模式的实现

假设我们正在设计一个做菜的程序。做菜的步骤大致是固定的:起锅,热油,加菜,加调料,出锅。不同的菜肴有相同的烹饪步骤,可以通过模板方法来实现不同菜肴的流程。

  • 抽象类
    public abstract class AbstractCook {
    
        public void cookProcess(){
            begin();
            pourOil();
            addVegetable();
            addSauce();
            end();
        }
    
        public void begin(){
            System.out.println("起锅");
        }
    
        public void pourOil(){
            System.out.println("烧油");
        }
    
        public abstract void addVegetable();
    
        public abstract void addSauce();
    
        public void end(){
            System.out.println("出锅");
        }
    }
  • 具体类
    public class CookCabbage extends AbstractCook{
        @Override
        public void addVegetable() {
            System.out.println("加白菜");
        }
    
        @Override
        public void addSauce() {
            System.out.println("加醋,加盐");
        }
    }
    
    public class CookCarrot extends AbstractCook{
        @Override
        public void addVegetable() {
            System.out.println("加胡萝卜");
        }
    
        @Override
        public void addSauce() {
            System.out.println("加盐,加味精");
        }
    }
  • 客户端
    public class Client {
        public static void main(String[] args) {
            AbstractCook cook = new CookCabbage();
            cook.cookProcess();
        }
    }
    
  • 运行结果

三、模板方法模式的优缺点

优点:
  1. 代码复用:模板方法模式将算法的公共部分提取到父类中,避免了重复代码,提高了代码复用性。
  2. 灵活性:尽管算法框架是固定的,但通过子类可以实现特定步骤的变化,符合开闭原则(对扩展开放,对修改封闭)。
  3. 控制反转:模板方法模式通过父类控制了算法的结构,子类只需关注具体的实现细节,不必关心算法框架。
缺点:
  1. 过度设计:如果算法结构简单,或者算法变化较小,使用模板方法模式可能会显得过于复杂,增加了设计的复杂度。
  2. 对子类依赖:子类必须依赖父类提供的模板方法和结构,这可能导致子类与父类之间耦合较高。子类只能按照父类定义的步骤来实现,无法自由调整流程。

四、模板方法模式的应用场景

模板方法模式适用于以下情况:

  1. 算法框架稳定,步骤可变

    当算法框架的结构不变,但具体的实现步骤可以变化时,模板方法模式是非常合适的选择。子类只需要实现算法中的具体步骤即可,而不需要关心框架本身的设计。
  2. 操作顺序固定,步骤可扩展

    比如游戏中的回合制战斗,或者一些具有固定执行顺序的流程,模板方法模式可以帮助固定这些步骤的顺序,并允许不同的子类根据需要改变具体的操作。
  3. 避免代码重复

    如果某个系统中有多个操作流程,且这些流程中有重复的步骤,那么模板方法模式可以有效地提取出这些共通的部分,从而减少重复代码。
  4. 框架的设计

    模板方法模式经常用于设计框架类。一个框架可以提供一个模板方法,子类在继承框架时只需实现其中的一些步骤。
现实生活中的例子:
  • 软件测试框架:在自动化测试框架中,测试步骤往往包括初始化、执行测试、清理环境等,模板方法模式可以帮助确保这些步骤的一致性,而允许子类定义具体的测试方法。
  • 文件处理:比如读取CSV文件、XML文件、JSON文件等,虽然不同的文件格式有不同的解析方法,但读取文件、解析文件和处理数据的步骤通常是相似的,模板方法模式可以用来构建一个统一的文件处理框架。

五、模板方法模式与其他设计模式的关系

模板方法模式与其他行为型设计模式有一些相似性和不同之处:

  1. 模板方法模式 vs 策略模式

    • 模板方法模式:定义了算法的骨架,允许子类实现具体的步骤,但整体算法框架不可改变。
    • 策略模式:允许算法在运行时改变,客户端可以选择不同的策略来完成任务,通常是通过组合来实现不同的策略,而不是通过继承来实现算法的变化。
  2. 模板方法模式 vs 状态模式

    • 状态模式:允许对象根据其内部状态的不同来改变其行为,状态是动态变化的。
    • 模板方法模式:则是在父类中定义一个固定的算法框架,子类仅需要实现某些步骤,而状态变化并不会影响整个算法的框架。

标签:子类,模式,算法,设计模式,方法,public,模板
From: https://blog.csdn.net/2403_82445975/article/details/143972688

相关文章

  • 6.STM32之通信接口《精讲》之USART通信(PC串口与OLED交互)---多字节数据收发(数据包的模
    本节将串口收发HEX数据包(发送数据包很简单,主要还是关注一下如何接收数据包)在这里给大家介绍一下状态机的思想状态机模式(StateMachinePatern)是一种用于描述对象的行为软件设计模式,属于行为型设计模式。在状态机模式中,对象的行为取决于其内部状态,并且在不同的状态下,对象可......
  • Ftp搭建虚拟用户模式
    Ftp搭建虚拟用户模式一、CentOS1.安装vsftp以及相关依赖yum-yinstallvsftpd*pam*db4*·vsftpd:ftp软件·pam:认证模块·DB4:支持文件数据库关闭selinuxsetenforce0#暂时关闭sed-ri's#(SELINUX=)enforcing#\1disabled#'/etc/selinux/config#永久关闭grep^......
  • wordpress二开-WordPress新增页面模板-说说微语
    微语说说相当于一个简单的记事本,使用还是比较方便的。这个版本的说说微语CSS样式不兼容,可能有些主题无法适配,但是后台添加内容,前端显示的逻辑已经实现。可以当作Wordpress二开中自定义页面模板学习~一、后台添加说说微语模块首先我们把以下代码,添加到主题根目录中的funct......
  • Sigrity SPEED2000 DDR simulation模式如何进行DDR仿真分析操作指导-DIMM On board-Wr
    SigritySPEED2000DDRsimulation模式如何进行DDR仿真分析操作指导-DIMMOnboard-Write模式SigritySPEED2000DDRsimulation模式如何进行DDR仿真分析操作指导-SODIMM-Write模式详细介绍了板载颗粒的仿真分析,下面介绍DIMMonboard的仿真分析,以下图为例进行说明<......
  • 实验四 类的组合、继承、模板类、标准库
    实验任务1:task1-1.cpp和task1-2.cpp以及task1-3.cpp的源码,运行测试结果如下#include<iostream>usingstd::cout;usingstd::endl;//类A的定义classA{public:A(intx0,inty0);voiddisplay()const;private:intx,y;};A::A(intx0,inty0):......
  • 装饰器模式 (Decorator Pattern)
    装饰器模式(DecoratorPattern)装饰器模式是一种结构型设计模式,它允许动态地向对象添加新的功能,同时又不改变其结构。这种模式通过对象组合来实现,比通过继承扩展功能更加灵活。原理核心思想:通过将对象包装在一系列装饰器中,增强或修改对象的功能,而无需更改对象本身的代......
  • 【性能测试】多压力机无GUI模式执行Jmeter脚本
    远程执行参数:-l:后面的文件是生成的jtl结果文件,这和文件名必须不存在,如果已经存在,就会报错。-o:后面的目录也必须为空,有内容也会报错。-e:是用来生成报表报告的,生成的报告结果文件会存在-o后面的文件夹里。参数解释:-n:表示nonguimode,就是非图形化模式-t:即testplan,后跟......
  • 模板集
    前言:洛谷、博客园、CSDN同步更新博客园可能食用更佳Part0缺省源&卡常Part0.1火车头#pragmaGCCoptimize(3)#pragmaGCCtarget("avx")#pragmaGCCoptimize("Ofast")#pragmaGCCoptimize("inline")#pragmaGCCoptimize("-fgcse")#pragma......
  • 实验4 类的组合、继承、模板类、标准库
    1.实验任务1task1_1.cpp1#include<iostream>2usingnamespacestd;34classA{5public:6A(intx0,inty0);7voiddisplay()const;8private:9intx,y;10};11A::A(intx0,inty0):x{x0},y{y0}{}12voidA::display()con......
  • 【模板】可并堆 之 左偏树
    **P3377【模版】左偏树/可并堆**#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn,m;structHeap{ intls,rs; intdist,val,fa;}tr[N];intfifa(intx){ returntr[x].fa==x?x:tr[x].fa=fifa(tr[x].fa);}intmerge(int......