模板模式:顾名思义就是定义一套模板,之后就按照这套模板执行。模板在父类中定义,子类不能修改这个模板,但是在模板中包含的部分方法的具体逻辑,可以自定义实现。
针对的场景,就是那种有复杂步骤的问题。比如做一件事有10个步骤,每个步骤里都包含一些方法,对于不同的场景来说,这些步骤中有些方法是相同的,而有些是不同的,那么相同的部分就可以放在父类中执行,而不同的部分就可以由子类自己实现。
举个例子感受一下吧:周末小憩,约几个朋友喝个茶
public abstract class Tea {
// 这就是模板, 泡茶的步骤,这个是不能被修改的
protected final void kungfuTea(){
water();
clean();
ready();
makeTea();
drink();
}
// 具体步骤的方法,有的是在父类中实现
private void water(){
System.out.println("烧水");
}
private void clean(){
System.out.println("清洗茶具");
}
private void drink(){
System.out.println("开始喝茶吧");
}
// 留待子类去实现
protected abstract void ready();
protected abstract void makeTea();
}
具体的实现:
public class Puer extends Tea{
@Override
protected void ready() {
System.out.println("正宗十年普洱");
}
@Override
protected void makeTea() {
System.out.println("洗一洗,泡一泡,晾一晾");
}
}
public class BIluochun extends Tea{
@Override
protected void ready() {
System.out.println("来杯碧螺春吧");
}
@Override
protected void makeTea() {
System.out.println("自己拿杯子");
}
}
测试:
public class Client {
public static void main(String[] args) {
// Tea tea = new Puer();
Tea tea = new BIluochun();
tea.kungfuTea();
}
}
小结一下:感觉这个模式有点儿似曾相识,想了想好像是前面的建造者模式中的装配环节,都是把一堆东西组合起来,不过建造者模式中组装的是某一个事物的组成部分,是静态的。而这里的模板模式,组装的是一系列的行为,是动态的。而且建造者模式的目的是创建得到对象,而模板的模式的目的就是对行为的组合。