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