在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式。
根据下面的示例程序理解模板方法模式。
1 package BigJunOba.bjtu.TemplateMethod; 2 3 public abstract class AbstractDisplay { 4 5 public abstract void open(); 6 public abstract void print(); 7 public abstract void close(); 8 public final void display() { 9 open(); 10 for (int i = 0; i < 5; i++) { 11 print(); 12 } 13 close(); 14 } 15 }
AbstractDisplay类是示例程序的核心。该类只实现了display方法,这个实现了的方法就是处理流程的框架。之后的子类都是按照这个框架来进行流程。(注意:这里的display方法是final方法,即子类不能继承这个方法也不能修改这个方法,只能调用这个方法。)
1 package BigJunOba.bjtu.TemplateMethod; 2 3 public class CharDisplay extends AbstractDisplay { 4 5 private char ch; 6 7 public CharDisplay(char ch) { 8 this.ch = ch; 9 } 10 11 @Override 12 public void open() { 13 System.out.print("<<"); 14 } 15 16 @Override 17 public void print() { 18 System.out.print(ch); 19 } 20 21 @Override 22 public void close() { 23 System.out.println(">>"); 24 } 25 26 }
作为子类之一的CharDisplay类可以对单个字符进行打印操作。
1 package BigJunOba.bjtu.TemplateMethod; 2 3 public class StringDisplay extends AbstractDisplay { 4 5 private String string; 6 private int width; 7 8 public StringDisplay(String string) { 9 this.string = string; 10 this.width = string.getBytes().length; 11 } 12 13 @Override 14 public void open() { 15 printline(); 16 } 17 18 @Override 19 public void print() { 20 System.out.println("|" + string + "|"); 21 } 22 23 @Override 24 public void close() { 25 printline(); 26 } 27 28 private void printline() { 29 System.out.print("+"); 30 for (int i = 0; i < width; i++) { 31 System.out.print("-"); 32 } 33 System.out.println("+"); 34 }
作为子类之一的StringDisplay可以对字符串进行操作。
1 package BigJunOba.bjtu.TemplateMethod; 2 3 public class Main { 4 public static void main(String[] args) { 5 AbstractDisplay d1 = new CharDisplay(‘H‘); 6 AbstractDisplay d2 = new StringDisplay("Fighting, BigJun"); 7 d1.display(); 8 d2.display(); 9 } 10 }
main方法中,生成了CharDisplay和StringDisplay的示例,然后可以调用继承的display方法。实际的程序行为取决于CharDisplay类和StringDisplay类的具体实现。