什么是模板?简单的说,模板就是固化的抽象了的算法。
举这么一个栗子:
有一个每天的生活流程:起床 -> 工作 -> 吃饭 -> 工作 -> 睡觉。
那么,这样一个流程就可以理解为是一个模板。模板的存在,只是指明了算法的运行流程,但是并没有具体指明该流程的细节。例如在上面的例子中,模板只指明了需要有起床这一个步骤,而并没有给出起床这一方法的细节(例如如何起床,是先穿衣服还是先穿袜子)。
有了模板之后,具体的类便可以在不改变流程的前提下,对每一个流程进行细节上的定义,此时模板便作为了一种公共的操作而存在。
看完上面的描述,可以发现,模板和抽象类很像,或者说,模板就是一个抽象类。
如果将上面所描述的流程以模板的形式来定义后,便可以这样来写:
//定义
abstract class Action{
public abstract void wakeUp();//起床
public abstract void work();//工作
public abstract void eat();//吃
public abstract void sleep();//睡觉
public void daily(){//一天的生活流程
this.wakeUp();
this.work();
this.eat();
this.work();
this.sleep();
}
}
这一个抽象类就可以看成是一个模板,在这个模板中,将所有的流程定义为了抽象方法,并使用一个非抽象方法将这些流程按照既定的算法整合起来。
既然是抽象类中的抽象方法,那么在普通的子类中就必须要被实现,而不同的子类可以有自己的实现细节,可以和其他的子类具有相同的实现细节,也可以和其他的子类具有不同的实现细节。
这,就是模板设计模式。
那么接下来写两个子类来实现一下这些抽象方法:
public class Class1 extends Action{
public void wakeUp(){
System.out.println("从床上坐了起来");
System.out.println("穿上了衣服");
System.out.println("穿上了裤子");
System.out.println("穿上了袜子");
}
public void work(){
System.out.println("开始写代码了");
}
public void eat(){
System.out.println("开始吃午饭了");
}
public void sleep(){
System.out.println("睡前敲了一会儿代码");
System.out.println("开始睡觉了");
}
}
public class Class2 extends Action{
public void wakeUp(){
System.out.println("从床上坐了起来");
System.out.println("穿上了衣服");
System.out.println("穿上了袜子");
System.out.println("穿上了裤子");
System.out.println("穿上了外套");
System.out.println("戴上了围巾");
}
public void work(){
System.out.println("开始写文章了");
}
public void eat(){
System.out.println("开始吃午饭了");
}
public void sleep(){
System.out.println("睡前看了一会儿书");
System.out.println("开始睡觉了");
}
}
这样一来,每一个子类都实现了模板中的方法,并且每一个子类实现的方法都具有这一个子类的特色。
在主函数中,若是要实现上面例子中的生活流程,则只需要调用抽象类封装好的方法便可以得到想要的结果,而不必关系具体的实现细节。
这样以来模板便只知道全局而不清楚细节,子类便只清楚细节而不知道全局,在调用时,模板作为子类公共的接口而被子类调用,就像这样:
public class Class3{
public static void main(String[] args){
Action demo1 = new Class1();
Action demo2 = new Class2();
demo1.daily(); //此时class1类会调用抽象类提供的公共接口实现整体流程
demo2.daily(); //此时class2类会调用抽象类提供的公共接口实现整体流程
}
}
抽象来看,整体的实现流程是这样的: