一个操作的具体步骤是确定的,但是它的每个具体步骤的实现各不相同。此时可以使用模板模式。
比如要做一个模块,它可以打印带有表头表体表尾的数据到HTML或者是Console:
- 基础类定义执行步骤,打印表头、表体、表尾
- 派生类精细化或者调整具体步骤的实现。在自己的特定的表头等打印步骤中为自己的类实现特定内容。比如HTMLReport应该为数据设置上标签。
事实上,当我完成MF的重构一书的第一章的案例的学习时,我居然并没有注意到它是一个模式呢。
模板方法如下:
public abstract class Report {
//模板方法
public final void play(){
printHeader();
printDetail();
printFooter();
}
}
复制代码
如下案例,在Game基类也定义了一系列的步骤,然后由不同的子类细化或者定义它们的实际操作:
基类模板方法如下:
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板方法
public final void play(){
initialize();
startPlay();
endPlay();
}
}
复制代码