Java 设计模式——模板方法 (Template Method)

什么是模板方法

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 是基于继承的代码复用的基本模式。

结构类图
《Java 设计模式——模板方法 (Template Method)》

抽象模板【AbstractTemplate】

  • 【模板方法】templateMethod : 把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
  • 【抽象方法】abstractMethod : 父类中定义好规范只声明但不加以实现,由它的子类去实现。【一般以doXX()命名】
  • 【钩子方法】hookMethod : 由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。【view的onDraw()方法】
  • 【具体方法】concreteMethod : 一个具体方法由抽象类声明并实现,而子类并不实现。【父类私有方法】

举个栗子

根据上面的结构介绍,定义一个需求

东汉末年三国战乱,百姓流离失所,刘备为了统筹人心和坚固自己的事业,开始让张飞和关羽招兵买马,但是新兵报道需要以下几个环节

  • 自我介绍
  • 体能测试
  • 额外才艺秀【非必须】

父类方法。

abstract class AbstractShu {
    /** * templateMethod */
    public void rule(Soldier soldier) {
        System.out.println("【蜀】 介绍: " + doIntroduce(soldier));
        System.out.println("【蜀】 习武: " + show());
        if (!skill().equals("")) {
            System.out.println("【蜀】 额外技能: " + skill());
        }
    }
    /** * abstractMethod */
    abstract String doIntroduce(Soldier soldier);
    /** * hookMethod */
    protected String skill() {
        return "";
    }
    /** * concreteMethod */
    private String show() {
        return "10分钟体能测试";
    }
}

这个是刘备定义的用人和测试法则,所有招人的流程已经规定好了,自我介绍方法introduce由继承者们去实现,额外技能skill()可以拓展也可以不拓展。

继承者关

首先关羽捋了捋胡子

public class GuanAbsShu extends AbstractShu {
    @Override
    String doIntroduce(Soldier soldier) {
        return "小生姓" + soldier.getLastName() + ",名" + soldier.getName() + "," + soldier.getLocation() + "人也。夷门谱牒,梁苑冠裳。";
    }

    @Override
    protected String skill() {
        return "八卦阵法";
    }
}

继承者张

张飞呢,掌握了蜀军的经济大权,忙着呢,心里嘀咕我这还要杀猪还要训练新兵,训啥训啊,能打就行。

public class ZhangAbsShu extends AbstractShu {

    @Override
    String doIntroduce(Soldier soldier) {
        return "我" + soldier.getLocation() + soldier.getLastName() + soldier.getName() + "做好事从来不留姓名";
    }
}

测试

经过了短期的训练,我们来看看训练结果

public class Test {
    public static void main(String[] args) throws Exception {
        Soldier soldier = new Soldier("子龙", "赵", "常山");

        AbstractShu soldier4Guan = new GuanAbsShu();
        soldier4Guan.rule(soldier);

        System.out.println("\n------------------------------------\n");

        AbstractShu soldier4Zhang = new ZhangAbsShu();
        soldier4Zhang.rule(soldier);
    }
}

《Java 设计模式——模板方法 (Template Method)》

总结

通过上面这个栗子也看出如果蜀国招了新的大将来训练士兵,只需要继承AbstractShu再新加一些技能即可。
所以模板方法是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 是基于继承的代码复用的基本模式。【重要的话要说2遍】
更多模板方法文章请移步郭神Ak47卡奴达摩

    原文作者:算法小白
    原文地址: https://juejin.im/entry/5923eeb20ce46300696d3c23
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞