热门标签 | 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

模板方法模式和策略模式



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

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

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

设计要点



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

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

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


更多


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


在这里插入图片描述


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


在这里插入图片描述



推荐阅读
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社区 版权所有