1. 概述
组成模板的方法被定义在父类中,由于这些方法是抽象方法,在父类中无法查看这些方法的具体实现,唯一可以知道的就是父类如何调用这些方法的。这种在父类中定义处理流程的框架,在子类中实现具体处理的模式就是模板方法(Template Method)设计模式。
举一个例子:学生都需要去上课,其上课的具体流程是上课、听课、下课,但是不同类学生听课(上课、下课)的具体内容不同,不过它们的流程相同,即上课->听课->下课,就可以在父类中定义上课、听课、下课三个抽象方法,具体实现交给不同的子类,然后在父类中创建一个完整的上课流程的框架,调用这三个方法(上课、听课、下课),接下来会用代码实现这个例子。
2. 代码实现
父类,一个抽象类,负责实现模板方法(theClassDisplay()),声明模板方法所使用到的抽象方法(startClass()上课 、inClass()上课中 、endClass()下课)。ClassAbstractDisplay.java 代码如下所示:
package template;
public abstract class ClassAbstractDisplay {
public abstract void startClass(); // 上课
public abstract void inClass(); // 上课中
public abstract void endClass(); // 下课
public void theClassDisplay() { //上课的整个流程展示
startClass();
for (int i=0; i<5; i++) {
inClass();
}
endClass();
}
}
两个具体子类如下,美术课,ArtClassDisplay.java :
package template;
public class ArtClassDisplay extends ClassAbstractDisplay{
public void startClass() {
System.out.println("##开始上美术课##");
}
public void inClass() {
System.out.println("美术课正在上课中...");
}
public void endClass() {
System.out.println("##美术课结束了##");
}
}
数学课,MathClassDisplay.java:
package template;
public class MathClassDisplay extends ClassAbstractDisplay{
public void startClass() {
System.out.println("**开始上数学课**");
}
public void inClass() {
System.out.println("...数学课正在上课中");
}
public void endClass() {
System.out.println("**数学课结束了**");
}
}
实例的UML图所示:
测试代码:
package template;
public class test {
public static void main(String args[]) {
ClassAbstractDisplay class01 = new ArtClassDisplay();
ClassAbstractDisplay class02 = new MathClassDisplay();
class01.theClassDisplay();
class02.theClassDisplay();
}
}
测试结果如下所示:
参考文献:
- 图解设计模式 - 结成浩著、杨文轩译 - 人民邮电出版社
END。