一、模版方法模式的概念
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。(基于继承的代码复用技术)
AbstractClass[抽象类]:抽象模版,定义并实现模版方法。它给出顶级逻辑的骨架,而逻辑的组成步骤推迟到子类实现。
ConcreteClass[具体子类]:实现父类中的抽象方法。每个 AbstractClass可以有任意个ConcreteClass,AbstractClass给出顶级逻辑的组成步骤的实现。
二、模版方法模式的实现
//抽象模版
public abstract class AbstractClass{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
//钩子方法
//(子类可选实现)
public void HookOperation(){}
//定义顶层逻辑架构
//使用final关键字,避免顶层逻辑被破坏
public final void TemplateMethod(){
//...
PrimitiveOperation1();
HookOperation();
PrimitiveOperation2();
//...
}
}
//具体类A
public class ConcreteClassA extends AbstractClass{
@Override
//逻辑步骤实现
public void PrimitiveOperation1() {
System.out.println("ConcreteClassA PrimitiveOperation1");
}
@Override
//逻辑步骤实现
public void PrimitiveOperation2() {
System.out.println("ConcreteClassA PrimitiveOperation2");
}
}
//具体类B
public class ConcreteClassB extends AbstractClass{
@Override
//逻辑步骤实现
public void PrimitiveOperation1() {
System.out.println("ConcreteClassB PrimitiveOperation1");
}
@Override
//逻辑步骤实现
public void PrimitiveOperation2() {
System.out.println("ConcreteClassB PrimitiveOperation2");
}
}
public class Test{
public static void main(String args[]) {
AbstractClass abc = new ConcreteClassA();
abc.TemplateMethod();
abc = new ConcreteClassB();
abc.TemplateMethod();
}
}
三、模版方法模式的应用
在Java Web中HttpServlet类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。
四、模版方法の其他问题
一般将模板方法声明为final
钩子方法在抽象类中不做事,或者是默认的事情,子类可以选择性覆盖
在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中
五、Reference
六、Resource