设计模式(三)Template Method模式

  在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为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类的具体实现。

 

 

 

posted @ 2018-03-29 17:19  BigJunOba  阅读(142)  评论(0编辑  收藏  举报