在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够在不改变算法结构的状况下,从新定义算法中的某些步骤。java
是一种重要的代码复用
的重要技巧。从实现的角度来讲,这符合封装变化
的思想。同时,钩子
是被声明在抽象类中,可是只有空的
或者默认
的算法实现,由子类决定是否进行覆盖,对算法的不一样点进行挂钩。当两个或多个类执行的操做能够抽象为统一的步骤算法,只是在每步细节的实现上有差别,则能够依赖模板方法构造一种继承体系(有变化就封装继承体系)算法
模板 = 方法 = 一组步骤(任何步骤均可以是抽象的,由子类负责实现)这能够确保算法的结构保持不变,同时由子类提供实现。spa
类图以下:]code
hook是对那些子类能够选择实现的功能,在抽像类中给出一个简单的默认实现,让子类决定去不去覆盖
这里涉及到两个角色:
抽象模板继承
具体模板ip
javaabstract class AbstractClass{ final void templateMethod(){ primitiveOperation1(); primitiveOperation2(); concreteOperation(); hook(); } // 声明为final 以避免子类改变这个算法的顺序 abstract void primitiveOperation1(); // 子类实现 abstract void primitiveOperation2(); // 子类实现 void concreteOperation(){ } void hook(){} }
什么时候使用抽象方法?什么时候使用hook?
当你的子类必须提供算法中某个步骤的实现时,就用抽象方法;
若是算法中这个步骤是可选的,就用hook. 经过使用钩子,让抽象类的子类的负荷减轻ituit