热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式详解:模板方法模式的应用与实现

模板方法模式是一种行为设计模式,通过定义一个操作中的算法骨架,将具体步骤的实现延迟到子类中。本文详细解析了模板方法模式的类图结构、实现方式以及挂钩机制,并结合实际案例进行了深入探讨。此外,文章还提供了丰富的参考资料,帮助读者更好地理解和应用这一设计模式。对于手机用户,建议横屏阅读以获得更佳的阅读体验。

[设计模式] 模板方法模式


目录


  • [设计模式] 模板方法模式

    • 类图

    • 实现

    • 挂钩

    • 总结

    • 更多



手机用户请横屏获取最佳阅读体验,REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。











平台地址
CSDNhttps://blog.csdn.net/sinat_28690417
简书https://www.jianshu.com/u/3032cc862300
个人博客https://yiyuery.github.io/NoteBooks/

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的具体实现步骤




类图

在这里插入图片描述



实现

//定义算法模板
public abstract class AbsractTemplate {
/**
* 准备工作
*/
void prepare(){
step1();
step2();
step3();
step4();
}
void step1(){
System.out.println("step1 completed!");
}
void step2(){
System.out.println("step2 completed!");
}
abstract void step3();
abstract void step4();
}

抽象类方法交由子类实现,抽象类模板中负责组织方法间调用的依赖和顺序管理。

public class HandlerOne extends AbsractTemplate {
@Override
void step3() {
System.out.println("HandlerOne step3");
}
@Override
void step4() {
System.out.println("HandlerOne step4");
}
}
public class HandlerTwo extends AbsractTemplate {
@Override
void step3() {
System.out.println("HandlerTwo step3");
}
@Override
void step4() {
System.out.println("HandlerTwo step4");
}
}


挂钩

抽象父类中还可以定义钩子函数,来由子类进行覆盖实现,可以用来控制方法的调用链的每个节点是否执行。

public abstract class AbsractTemplate {
/**
* 准备工作
*/
void prepare(){
step1();
step3();
step4();
if(hook()){
step2();
}
}
void step1(){
System.out.println("step1 completed!");
}
void step2(){
System.out.println("step2 completed!");
}
abstract void step3();
abstract void step4();
//钩子
boolean hook(){
return false;
}
}

子类实现覆盖钩子函数

public class HandlerThree extends AbsractTemplate {
@Override
boolean hook() {
return true;
}
@Override
void step3() {
System.out.println("HandlerThree step3");
}
@Override
void step4() {
System.out.println("HandlerThree step4");
}
}


总结


模板方法模式



  • 高层组件(抽象基类)决定方法调用逻辑,对待底层实现类的方式是“别调用我们,我们会调用你”(好莱坞原则)

  • 避免高层和低层组件相互交叉依赖的“依赖腐败”问题发生。

  • 在高层组件中定义方法的调用逻辑,在低层组件中通过挂钩函数的覆盖实现来控制节点执行的条件控制。

  • 定义算法步骤后,将步骤的实现延迟在子类(低层组件)决定如何实现算法的具体步骤。

  • 为代码重用提供了一种方案。

  • 模板方法的抽象类可以定义具体的方法,抽象方法和钩子

  • 钩子是一种方法,它在抽象类中不做事,只做默认的事,子类可以选择要不要覆盖它,主要用于高层组件在角色方法的调用步骤时使用。

  • 为防止子类修改算法模板的方法,可以将模板方法声明为final

模板方法模式和策略模式



  • 策略模式定义一组算法行为对象,具体行为由算法行为基类的子类实现,调用算法行为的抽象基类只负责调用算法接口中定义的方法。

  • 模板方法模式针对是公共算法的实现,由抽象基类(算法模板)决定方法执行顺序和需要抽象供子类实现的方法。

  • 模板方法通过继承的方式独立管理算法实现,策略模式通过组合的方式,将具体的算法行为委托给指定算法行为对象来实现。

设计要点



  • 好莱坞原则告诉我们,将决策权放在高层模块中,以便于决定如何、何时调用低层模块

  • 策略模式和模板方法模式都是封装算法,前者用组合,后者用继承

  • 工厂方法模式是模板方法的一个特殊的版本


更多


扫码关注架构探险之道,回复文章标题,获取本文相关源码和资源链接


在这里插入图片描述


知识星球(扫码加入获取历史源码和文章资源链接)


在这里插入图片描述



推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
author-avatar
翔未央图_971
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有