在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为 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类有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继承了抽象类AbstractDisplay,实现open、print、close方法,三个方法的处理如下表所示
方法名处理open显示字符串 “<<”print显示构造函数接收的一个字符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(">>"); } }与CharDispaly类一样,StringDispaly类也实现了open、print、close方法,三个方法的处理如下表所示
方法名处理open显示字符串 “+ ---- +”print在构造函数接收的字符串前后分别加上 “|” 并显示出来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类的作用是测试程序行为。在该类中生成了 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(); } }