Template Method简介
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为 Template Method模式。
TemplateMethod的类图如下
其中AbstractClass是抽象类,ConcteteClass是继承该抽象类的子类。
-
AbstractClass中
method1、method2、method3是抽象方法,没有具体的实现;
templateMethod是使用final修饰的普通方法,具体实现调用抽象方法。 -
ConcreteClass中
method1、method2、method3是对抽象类的抽象方法的重写,有具体的实现。 -
Main方法
通过使用AbstractClass abstractClass = new ConcreteClass(args);
,再调用abstractClass的templateMethod
模板方法。
示例程序
此程序是一段将字符和字符串循环显示4次的简单程序。
类的一览表
名字 | 说明 |
---|---|
AbstractDisplay | 只实现了display方法的抽象类 |
CharDisplay | 实现了open、print、close方法的类 |
StringDisplay | 实现了open、print、close方法的类 |
Main | 测试程序行为的类 |
示例程序的类图
在AbstractDisplay类中定义了display方法,而且在该方法中依次调用了open、print、close这三个抽象方法。在CharDisplay和StringDisplay中有这三个抽象方法的具体实现。
AbstractDisplay 类
AbstractDisplay类有4个方法,分别是 display、open、print、close。其中只有 display方法实现了,open、print、close都是抽象方法。通过查看AbstractDisplay类中 display方法的代码,我们可以知道 display方法进行了以下处理。
- 调用 open 方法
- 调用四次 print 方法
- 调用 close 方法
AbstractDisplay.java
public abstract class AbstractDisplay {
// 抽象方法
public abstract void open();
public abstract void print();
public abstract void close();
// 模板方法
public final void display() {
open();
for (int i = 0; i < 4; i++) {
print();
}
close();
}
}
CharDisplay 类
CharDisplay继承了抽象类AbstractDisplay,实现open、print、close方法,三个方法的处理如下表所示
方法名 | 处理 |
---|---|
open | 显示字符串 “<<” |
显示构造函数接收的一个字符 | |
close | 显示字符串 “>>” |
这样,当 display方法被调用时,假设我们向 CharDisplay的构造函数中传递的参数是 H 这个字符,那么最终显示出来的会是如下结果。
<<HHHH>>
CharDisplay.java
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay 类
与CharDispaly类一样,StringDispaly类也实现了open、print、close方法,三个方法的处理如下表所示
方法名 | 处理 |
---|---|
open | 显示字符串 “+ ---- +” |
在构造函数接收的字符串前后分别加上 “|” 并显示出来 | |
close | 显示字符串 “+ ---- +” |
此时,如果 dipslay方法被调用,假设我们向 CharDisplay的构造函数中传递的参是 “Hello World” 这个字符串,那么最终结果会像下面这样,文字会被显示在方框内部。
+-----------+
|Hello World|
|Hello World|
|Hello World|
|Hello World|
+-----------+
StringDisplay.java
public class StringDisplay extends AbstractDisplay {
private String str;
public StringDisplay(String str) {
this.str = str;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + str + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
int width = str.getBytes().length;
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Main类
Main类的作用是测试程序行为。在该类中生成了 CharDisplay类和StringDisplay类的实例,并调用了 display方法。
Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello World");
d1.display();
d2.display();
}
}
运行结果
<<HHHH>>
+-----------+
|Hello World|
|Hello World|
|Hello World|
|Hello World|
+-----------+