模板方法适用于流程固定,具体步骤的实现确实变化的场景。举个例子,当你去游泳的时候你会经历
换衣服 -> 热身->游泳
这个流程是固定的,然而当具体到游泳的时候就千差万别了,你用蛙泳,仰泳,自由泳,蝶泳或者各种千奇百怪的姿势。模板方法在这个时候就有用武之地了。先来看一下模板方法的UML:
拿刚刚游泳为例来设计我们的类:
public abstract class Swimmer {
public void swimActivity() {
getChanged();
prepare();
swimming();
}
private void getChanged() {
System.out.println("Changing");
}
private void prepare() {
System.out.println("Preparing");
}
protected abstract void swimming();
}
public class BreaststrokeSwimmer extends Swimmer {
@Override
protected void swimming() {
System.out.println("Swimming in breaststroke");
}
}
public class FreeStrokeSwimmer extends Swimmer {
@Override
protected void swimming() {
System.out.println("Swimming in free stroke");
}
}
public class SwimmerFactory {
public static Swimmer getBreaststrokeSwimmer() {
return new BreaststrokeSwimmer();
}
public static Swimmer getFreeStrokeSwimmer() {
return new FreeStrokeSwimmer();
}
}
public class TestSwimmers {
public static void main(String ...args) {
Swimmer breaststroke = SwimmerFactory.getBreaststrokeSwimmer();
Swimmer freeStroke = SwimmerFactory.getFreeStrokeSwimmer();
breaststroke.swimActivity();
freeStroke.swimActivity();
}
}
这样,所有继承自Swimmer的类只需要实现swimming()方法,就可以使用swimActivity了。模板方法定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法是比较基础的设计模式,应用十分广泛,被框架、类库大量采用。实际上即使不知道模板方法的存在,我们在写代码的时候还是经常会用到这种设计。