设计模式- 模板方法模式(Template Method Pattern) 结构|原理|优缺点|场景|示例

server/2024/10/11 13:19:13/

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式        责任链模式        命令模式

                                   备忘录模式          状态模式          访问者模式        中介者模式


模板方法模式(Template Method Pattern)是一种行为型设计模式,用于定义一个算法的骨架,而将一些步骤的具体实现延迟到子类中。这样,可以在不改变算法结构的情况下,让子类重新定义算法中的某些步骤。

主要角色:

  1. 抽象类(Abstract Class):定义一个模板方法(Template Method),其中包含算法的框架,以及一些抽象方法或具体方法。抽象类中的模板方法定义了算法的步骤顺序,并调用了具体的方法,这些方法可以是抽象的,由子类去实现。

  2. 具体子类(Concrete Class):继承自抽象类,实现了其中定义的抽象方法,提供了算法中特定步骤的具体实现。具体子类可以覆盖抽象类中的方法,以实现特定的行为。

工作原理:

  1. 抽象类定义了一个模板方法,其中包含了算法的骨架,以及一些抽象方法或具体方法。
  2. 具体子类继承抽象类,并实现其中的抽象方法,提供算法中特定步骤的具体实现。
  3. 客户端通过调用抽象类中的模板方法来使用算法,具体子类会按照模板方法定义的算法框架执行相应的步骤。

优点:

  • 提高代码复用性:通过抽象模板方法,封装了算法的通用部分,使得代码更易于维护和扩展。
  • 灵活性:允许子类根据需要重新定义或扩展算法中的特定步骤,从而实现定制化。
  • 便于管理:通过模板方法对算法进行统一管理和调度,提高了代码的结构化程度。

缺点:

  • 可能导致代码膨胀:如果模板方法中的步骤过多或过于复杂,会增加子类的实现难度,导致代码膨胀。
  • 限制灵活性:模板方法模式可能限制了子类的灵活性,特定步骤的实现必须符合父类定义的算法框架。

适用场景:

模板方法模式适用于以下场景:

  • 当需要实现一组算法中的共同部分,并将可变部分延迟到子类中时。
  • 当存在多个具有相似算法结构但实现细节不同的情况时。
  • 当希望通过一个固定的算法框架来管理和调度算法时。
代码示例(以Java为例)
// 抽象类定义了算法框架
abstract class AbstractClass {// 模板方法定义了算法的骨架,调用了具体的方法public void templateMethod() {step1();step2();step3();}// 具体方法,有默认实现protected void step1() {System.out.println("AbstractClass: Performing step 1");}// 抽象方法,由子类实现protected abstract void step2();// 具体方法,可以在子类中选择是否覆盖protected void step3() {System.out.println("AbstractClass: Performing step 3");}
}// 具体子类实现了抽象类中的抽象方法
class ConcreteClass extends AbstractClass {// 实现了抽象方法@Overrideprotected void step2() {System.out.println("ConcreteClass: Performing step 2");}
}public class Main {public static void main(String[] args) {// 创建具体子类对象AbstractClass obj = new ConcreteClass();// 调用模板方法obj.templateMethod();}
}

代码示例(以Python为例)

from abc import ABC, abstractmethod# 抽象类定义了算法框架
class AbstractClass(ABC):# 模板方法定义了算法的骨架,调用了具体的方法def template_method(self):self.step1()self.step2()self.step3()# 具体方法,有默认实现def step1(self):print("AbstractClass: Performing step 1")# 抽象方法,由子类实现@abstractmethoddef step2(self):pass# 具体方法,可以在子类中选择是否覆盖def step3(self):print("AbstractClass: Performing step 3")# 具体子类实现了抽象类中的抽象方法
class ConcreteClass(AbstractClass):# 实现了抽象方法def step2(self):print("ConcreteClass: Performing step 2")if __name__ == "__main__":# 创建具体子类对象obj = ConcreteClass()# 调用模板方法obj.template_method()

在这个示例中,AbstractClass 是抽象类,定义了模板方法 templateMethod() 和具体方法 step1()step3(),以及抽象方法 step2()ConcreteClass 是具体子类,实现了抽象方法 step2()。在 Main 类中,我们创建了 ConcreteClass 的对象,并调用了模板方法 templateMethod(),它按照定义的算法骨架执行了相应的步骤。


http://www.ppmy.cn/server/16168.html

相关文章

【深度学习-第5篇】使用Python快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例(使用pytorch框架)

在之前的文章中介绍了CNN的图解入门,CNN的MATLAB分类实现,CNN的MATLAB回归实现。 卷积神经网络(Convolutional Neural Networ,简称CNN)是一种广泛应用于图像识别领域的深度学习算法。它通过模拟人类视觉系统的层次结构,可以自动提…

2024年区块链链游即将迎来大爆发

随着区块链技术的不断发展和成熟,其应用领域也在不断扩展。其中,区块链链游(Blockchain Games)作为区块链技术在游戏行业中的应用,备受关注。2024年,区块链链游行业即将迎来爆发,这一趋势不容忽…

2024/4/25 红外遥控代码

51完结撒花&#xff01;&#xff01;&#xff01; 这块如果IR听不懂可以看看那个状态机的相关视频。 Int0.c #include <REGX52.H>void Int0_Init(void) {IT01;IE00;EX01;EA1;PX01; }//void Int0_Routine(void) interrupt 0 //{ // Num; //} Timer0.c #include …

vue框架中的路由

vue框架中的路由 一.VueRouter的使用&#xff08;52&#xff09;二.路由模块封装三.声明式导航 - 导航链接1.router-link-active类名2.router-link-exact-active类名3.声明式导航-自定义类名 四.查询参数传参五.动态路由传参方式查询参数传参 VS 动态路由传参 六.动态路由参数的…

C#中=> “Lambda运算符”

在C#中&#xff0c;> 符号被称为“Lambda运算符”或“Lambda箭头”。它用于连接Lambda表达式中的参数列表和表达式主体&#xff0c;表示函数的输入和输出关系。因此&#xff0c;Lambda运算符充当了将参数映射到表达式的箭头。 Lambda运算符的左侧是参数列表&#xff0c;它们…

BFS解决八数码问题-java

本文主要通过BFS广度优先搜索来解决八数码问题。 文章目录 前言 一、八数码 二、算法思路 1.思路模拟 2.实现思路 三、代码 1.代码如下&#xff1a; 2.读入数据 3.代码运行结果 总结 前言 本文主要通过BFS广度优先搜索来解决八数码问题。 提示&#xff1a;以下是本篇文章正文内…

轻质砖工艺中墙建材宝山奉贤崇明轻质砖苏州黄浦杨浦加气块闵行嘉定金山吴江姑苏虎丘aac加气砌块松江青浦吴中相城

轻质砖工艺中墙建材宝山奉贤崇明轻质砖苏州黄浦杨浦加气块闵行嘉定金山吴江姑苏虎丘aac加气砌块松江青浦吴中相城 苏州地区的轻质砖生产工艺可能遵循行业通用的制作流程&#xff0c;结合当地资源条件、技术标准及环保政策进行优化。以下是一般轻质砖&#xff08;包括但不限于陶…

Linux安装Docker的多版本PHP和多版本MySQL共存

1: 先安装docker 安装完后执行,权限设置 sudo usermod -aG docker $USER或者sudo usermod -aG docker kentrl#添加当前用户到Docker用户组中 sudo newgrp docker#更新用户组数据,必须执行否则无效 sudo systemctl restart docker 先看目录结构: 2:按照目录结构挂载磁盘,…