GoF原文
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)
模板方法模式适用于以下应用场景
(1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
(2)各子类中公共的行为被提取出来,集中到一个公共的父类中,从而避免代码重复。
Abstract Class
由于我们希望一些方法由子类实现,所以必须将基类设置为抽象类
。
为了确保子类不会重写模板方法,我们应该将其设置为final
public abstract class HouseTemplate {
//template method, final so subclasses can't override
public final void buildHouse() {
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//default implementation
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//methods to be implemented by subclasses
public abstract void buildWalls();
public abstract void buildPillars();
}
其中buildHouse()
是模板方法,它定义了执行几个步骤的执行顺序。
Concrete Classes
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
使用
public class Main {
public static void main(String[] args) {
HouseTemplate houseType;
houseType = new WoodenHouse();
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
结果
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
模板方法模式在JDK源码中的应用
Thread的run和start
就是一个比较典型的模板设计模式
java.io.InputStream,
java.io.OutputStream,
java.io.Reader
java.io.Writer.
的所有非抽象方法
java.util.AbstractList,
java.util.AbstractSet
java.util.AbstractMap.
的所有非抽象方法。
比如:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
abstract public E get(int index);
...
}