模版方法模式/Template Method
意图/适用场景:
模版方法模式其实是一种应用很广泛的模式,特别是在使用抽象类的时候。
模版方法模式中必然有一个核心的抽象类,不能是接口。声明一些抽象方法,这些方法由子类来做各不相同的实现;也可以是一些非抽象的方法,这些方法只是做为默认的实现,子类应该覆盖它们。
此外,还要定义一个或多少具体的方法,它们实现一些逻辑,调用前面提到的抽象或非抽象方法。这种方法就本模式中最重要的部分,这样的方法一般规定了调用其它抽象方法的逻辑,所以它是一个模版,这个方法就称为模版方法。
模版方法一般不被子类覆盖,否则就失去了“模版”的作用。
UML:
参与者:
- 抽象模版(Abstract Template):
- 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作。
- 定义并实现一个模版方法,这是一个具体的方法,给出了一个逻辑骨架,以固定的顺序和条件来调用其它的抽象方法。它定义了调用逻辑,是一个模版。
- 具体模版(Concrete Template):
- 以自己的方式实现父类所定义的抽象方法。
要点:
模版方法模式中的方法:
- 模版方法:
- 一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个方法在抽象类中定义,并由子类不加修改地完全继承。
- 基本方法:
主要由子类来实现或重写,体现继承关系的方法称为基本方法。基本方法又可以分为三种:
-
- 抽象方法:必须由子类来实现的方法。
- 具体方法:具体方法仍然由抽象类实现,而子类并不实现或重写。有些具体方法可以起来工厂方法的作用。
- 钩子方法:钩子方法也由抽象类来实现,但这只是作为一种默认的实现,一般是空的。子类应该重新实现,如果没有的话,只是说明不需要。
示例代码:
[java]
// Source code from file:AbstractTemplate.java
packagedesignPatterns.TemplateMethod;
publicabstract class AbstractTemplate {
// abstract method
protectedabstract void abstractMethod();
// hook method, provide default implementation
protectedvoid hookMethod() {
System.out.println("AbstractTemplate.hookMethod()");
}
// template method
publicvoid templateMethod() {
abstractMethod();
hookMethod();
}
}
// Source code from file:ConcreteClassA.java
packagedesignPatterns.TemplateMethod;
publicclass ConcreteClassA extends AbstractTemplate {
protectedvoid abstractMethod() {
System.out.println("ConcreteClassA.abstractMethod()");
}
protectedvoid hookMethod() {
System.out.println("ConcreteClassA.hookMethod()");
}
}
// Source code from file:ConcreteClassB.java
packagedesignPatterns.TemplateMethod;
publicclass ConcreteClassB extends AbstractTemplate {
protectedvoid abstractMethod() {
System.out.println("ConcreteClassB.abstractMethod()");
}
}
// Source code from file:User.java
packagedesignPatterns.TemplateMethod;
publicclass User {
publicstatic void main(String[] args) {
AbstractTemplate a =new ConcreteClassA();
AbstractTemplate b =new ConcreteClassB();
a.templateMethod();
b.templateMethod();
}
}
[/java]