ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-09 17:03:15  阅读:173  来源: 互联网

标签:子类 void 模式 算法 step4 设计模式 方法 模板


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

目录

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

平台 地址
CSDN https://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

模板方法模式和策略模式

  • 策略模式定义一组算法行为对象,具体行为由算法行为基类的子类实现,调用算法行为的抽象基类只负责调用算法接口中定义的方法。
  • 模板方法模式针对是公共算法的实现,由抽象基类(算法模板)决定方法执行顺序和需要抽象供子类实现的方法。
  • 模板方法通过继承的方式独立管理算法实现,策略模式通过组合的方式,将具体的算法行为委托给指定算法行为对象来实现。

设计要点

  • 好莱坞原则告诉我们,将决策权放在高层模块中,以便于决定如何、何时调用低层模块
  • 策略模式和模板方法模式都是封装算法,前者用组合,后者用继承
  • 工厂方法模式是模板方法的一个特殊的版本

更多

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

在这里插入图片描述

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

在这里插入图片描述

标签:子类,void,模式,算法,step4,设计模式,方法,模板
来源: https://blog.51cto.com/u_15263565/2886083

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有