当前位置: 首页 > news >正文

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

定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求

模版方法使用场景

  1. 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现可能因情境不同而变化时,可以使用模板方法模式。这使得你可以在不改变整体结构的情况下,通过子类来定制特定步骤的实现。
  2. 避免代码重复:当你有多个类中的方法具有相似的步骤,但实现细节有所不同时,可以将这些相似的步骤提取到一个抽象类的模板方法中,从而避免代码重复。
  3. 框架或库的设计:在框架或库的设计中,通常会定义一些通用的算法框架,但具体实现需要留给使用者来完成。模板方法模式在这种情况下可以帮助定义框架的核心逻辑,同时留下扩展点供使用者进行自定义。
  4. 生命周期方法:当需要确保对象在特定的生命周期阶段执行特定步骤时,模板方法模式可以派上用场。比如在资源管理、初始化和销毁等场景下。
  5. 代码的扩展和维护:模板方法模式遵循开闭原则,当需要添加新的功能或修改算法的部分步骤时,只需要新增或修改子类,而不需要改动抽象类的代码,从而提升了代码的可扩展性和可维护性。

模版方法主要角色

  1. 抽象类(Abstract Class):定义了一个模板方法,它是一个包含算法框架的方法,其中的具体步骤可以是抽象方法或已实现的方法。抽象类还可以包含一些通用方法,这些方法在模板方法中被使用。
  2. 具体子类(Concrete Subclass):继承抽象类并实现其中的抽象方法,从而完成算法的具体步骤。每个具体子类可以根据需要实现自己的逻辑。

模版方法java代码实例

abstract class CaffeineBeverage {final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}abstract void brew();abstract void addCondiments();void boilWater() {System.out.println("Boiling water");}void pourInCup() {System.out.println("Pouring into cup");}
}class Coffee extends CaffeineBeverage {void brew() {System.out.println("Dripping coffee through filter");}void addCondiments() {System.out.println("Adding sugar and milk");}
}class Tea extends CaffeineBeverage {void brew() {System.out.println("Steeping the tea");}void addCondiments() {System.out.println("Adding lemon");}
}public class TemplateMethodPatternDemo {public static void main(String[] args) {CaffeineBeverage coffee = new Coffee();coffee.prepareRecipe();CaffeineBeverage tea = new Tea();tea.prepareRecipe();}
}

在这个示例中,CaffeineBeverage 是抽象类,定义了制作咖啡因饮料的模板方法 prepareRecipe(),以及具体步骤中的通用方法。Coffee 和 Tea 是具体子类,分别实现了 brew() 和 addCondiments() 方法。在主程序中,我们创建了咖啡和茶的实例,并调用了它们的 prepareRecipe() 方法,实现了整个制作过程

模版方法优缺点

优点:

  1. 代码复用性
    模板方法模式鼓励将相同的代码逻辑放在抽象类中,从而避免在多个具体类中重复实现相同的代码,提高了代码的复用性。
  2. 高层逻辑抽象
    模板方法将高层的算法逻辑抽象到抽象类中,使得具体子类只需要关注特定步骤的实现,而无需考虑整体算法的结构。
  3. 固定算法框架
    模板方法定义了一个算法的框架,确保了整个算法的结构一致性。这有助于遵循最佳实践并减少错误。
  4. 易于维护
    由于相同的代码逻辑集中在抽象类中,修改算法逻辑或添加新特性只需要在一个地方进行修改,减少了维护的复杂性。
  5. 灵活性
    具体子类可以通过重写特定步骤来实现个性化需求,从而在保持整体框架不变的情况下增加灵活性。

缺点:

  1. 限制子类的自由度
    尽管模板方法模式提供一定程度的灵活性,但子类的扩展通常被限制在模板定义的框架内。这可能导致某些情况下子类需要强行适应框架,而不是完全自由地设计。
  2. 增加类的数量
    使用模板方法模式通常会引入抽象类和具体子类,可能会增加类的数量,增加了代码的复杂性。
  3. 不适合每个情况
    并非所有算法都适合使用模板方法模式。如果算法的步骤变化较小或步骤变化较大,使用其他模式可能更合适。
  4. 复杂性增加
    尽管模板方法模式可以帮助整理算法的结构,但在某些情况下可能会引入复杂性,尤其是当算法本身变得复杂时
http://www.lryc.cn/news/138094.html

相关文章:

  • [Linux]进程状态
  • Python爬虫逆向实战案例(五)——YRX竞赛题第五题
  • js识别图片中的文字插件 tesseract.js
  • Linux设备驱动移植(设备数)
  • 【移动端开发】鸿蒙系统开发入门:代码示例与详解
  • Jenkins的流水线详解
  • DIFFEDIT-图像编辑论文解读
  • 【优选算法】—— 字符串匹配算法
  • Docker容器:docker consul的注册与发现及consul-template守护进程
  • Blazor 依赖注入妙用:巧设回调
  • Python 基础 -- Tutorial(三)
  • 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
  • 微信小程序开发教学系列(1)- 开发入门
  • Nginx虚拟主机(server块)部署Vue项目
  • JAVA开发环境接口swagger-ui使用总结
  • mongodb 数据库管理(数据库、集合、文档)
  • 分布式与集群的定义及异同
  • 电脑端teams一直在线小程序,简单好用易上手
  • YOLOv5算法改进(4)— 添加CA注意力机制
  • 无涯教程-PHP - XML GET
  • Spark Standalone环境搭建及测试
  • 【PHP】流程控制-ifswitchforwhiledo-whilecontinuebreak
  • Pytorch-day04-模型构建-checkpoint
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务
  • python numpy array dtype和astype类型转换的区别
  • 浮动属性样式
  • keepalived双机热备 (四十五)
  • SpringBoot整合阿里云OSS,实现图片上传
  • Dynaminc Programming相关
  • 使用 Elasticsearch 轻松进行中文文本分类