一、概念
概念
UML简图
角色
使用场景
其实我们常用得抽象类就是这个模式得运用,所以基本上属于比较好理解的一种模式。
二、实践
根据上述角色,给出相应代码
抽象模板
/**
* 抽象模板
*
* @author Administrator
**/
public abstract class AbstractTemplate {
/**
* 模板方法的声明和实现
*/
public void templateMethod() {
// 调用由子类实现的方法
operation1();
operation2();
// 调用已经实现的方法
operation3();
}
public abstract void operation1();
public abstract void operation2();
private final void operation3() {
// 已经实现
}
}
具体模板
/**
* 具体模板
*
* @author Administrator
**/
public class ConcreteTemplate extends AbstractTemplate{
@Override
public void operation1() {
// 基本方法实现
}
@Override
public void operation2() {
// 基本方法实现
}
}
至于使用就很简单了:
public static void main(String[] args) {
AbstractTemplate template = new ConcreteTemplate();
template.templateMethod();
}
三、改进与思考
模板方法的核心就是“好莱坞原则”——子类可以替换掉父类的可变部分,但不能改变顶级逻辑。
其他注意点
模板方法的理念就是应当尽量减少子类重写父类的基本方法
命名方面
钩子方法应当以do开头,这在web里面的httpServlet里可以具体看到!
关于重构
大方法应当打散,改为模板方法进行调用。如果有局部变量的声明,可以通过一个专用的取值方法进行处理。
重构的一个方向便是尽量将行为往高端移动,而状态往子类走,尽量将状态的声明延迟到子类,这样就可以实现行为和状态的分离。如果上层抽象类中确实需要用到状态,则使用相应的取值方法(get()).