1.模板方法模式(Template Method) 定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
2.结构图
3.一个简单的例子
3.1定义一个抽象模板类life;里面定义了起床,去上班,工作,下班。
public abstract class Life {
private void getUp(){
System.out.println("早上起床!");
}
public void oneDay(){
getUp();
goToWork();
work();
goToHome();
}
public void goToHome() {
}
public abstract void work();
public void goToWork() {
}
}
说明:可以看到,抽象类中定义了公共的方法起床;也定义了去工作和回家的两个子类不必实现的方法;还有一个具体工作的方法,必须由子类去实现;而一天的生活,通过oneday方法已经定义好了,执行顺序也是固定的;也就是所有子类的方法调用顺序都是固定的了,这就是模板方法。
3.2分别定义老板和员工的一天生活:
public class Boss extends Life {
@Override
public void work() {
System.out.println("给员工分配工作");
}
@Override
public void goToWork() {
System.out.println("开车去");
}
@Override
public void goToHome() {
System.out.println("开车回");
}
}
public class Worker extends Life {
@Override
public void work() {
System.out.println("干活");
}
@Override
public void goToWork() {
System.out.println("坐公交去");
}
@Override
public void goToHome() {
System.out.println("坐公交回");
}
}
说明:可以看到,不管是老板还是员工,都必须实现一个具体工作的方法,因为他们的工作内容是完全不一样的;而上下班的交通工具却可以自己选择实现或不实现;起床又是公有的,所以定义在了抽象类中,这里也不需要去实现。
3.3调用
public static void main(String[] args) {
Boss boss = new Boss();
boss.oneDay();
System.out.println("--------------------------");
Worker worker = new Worker();
worker.oneDay();
}
打印结果:
可以发现,老板和员工的一天的做事流程是一样的;但有些事情的具体做法却因人而异。模板方法只规定了执行顺序,不关心具体的执行内容。
4.优缺点及适用场景
优点:模板方法所不变的行为搬到超类,去除子类中的重复代码,提供了一个很好了代码复用平台;
缺点:当类的功能越来越多,变得复杂时,抽象类的管理和扩展就变得复杂了。
适用场景:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。