模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这个模式是用来创建一个算法的模板。模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以保持算法的结构保持不变,同时由子类提供部分实现。
这个模式还可以使用一种叫做“钩子”的方法。何谓“钩子”,或,它的作用是什么?
钩子可以让子类实现算法中的可选部分,让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应,或决定是否做某些步骤。
模板方法中有一些抽象方法,也可能有一些钩子,对于使用何者,如何确定?
当子类必须提供算法中的某个方法或步骤的实现时,就使用抽象方法;如果这个方法是可选的,就使用钩子。
代码示例:
public abstract class A { // final 关键字表示子类无法覆盖,该方法即模板方法 final void templateMethod() { // 下面即步骤(结构) // 子类必须覆盖 Method1(); // 子类必须覆盖 Method2(); // 钩子,子类选择性覆盖,联系上面所述 if(hook1()) { // 子类无法覆盖 Method3(); } // 钩子,子类选择性覆盖,联系上面所述 hook2(); } abstract void Method1() { // 定义成抽象方法,由子类实现 } abstract void Method2() {} final void Method3() { // do something // 子类直接继承使用即可 } Boolean hook1() { // 这个方法可以默认不做事,也可以做一些简单的事, // 我们称之为“钩子”,子类可以视情况决定要不要覆盖他们, // 该钩子一般用来决定是否做某些步骤 } void hook2() { // 这个方法可以默认不做事,也可以做一些简单的事, // 我们称之为“钩子”,子类可以视情况决定要不要覆盖他们 // 该钩子一般用来做一些事情 } }