特点
定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
主要角色
- 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下:
- 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
- 基本方法:是整个算法中的一个步骤,包含以下几种类型
- 抽象方法:在抽象类中申明,由具体子类实现。
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
- 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
实现
public abstract class AbstractRole {
public final void print(){
openComputer();
chooseContent();
doPrint();
}
protected abstract void openComputer();
protected abstract void chooseContent();
protected void doPrint(){
System.out.println("print somethings");
}
}
public class ConcreteRoleA extends AbstractRole {
@Override
protected void openComputer() {
System.out.println("open thinkPad");
}
@Override
protected void chooseContent() {
System.out.println("choose a PDF");
}
}
public class ConcreteRoleB extends AbstractRole {
@Override
protected void openComputer() {
System.out.println("open hp");
}
@Override
protected void chooseContent() {
System.out.println("choose a word");
}
}
模板方法感觉是建造者模式很像,不过模板方法是在抽象角色里面封装了执行的顺序,而建造者模式是在指挥者里面封装了执行顺序。