下面我們用例子說明模板方法
程序示例類之間的關系
1.模板類,相當于我們上面提到的薄片塑料板
- package com.pattern.templateMethod;
- /**
- * 抽象類,充當模板角色
- * @author administrator
- *
- */
- public abstract class AbstractDisplay {
- //由子類實現的抽象方法
- public abstract void open();
- public abstract void print();
- public abstract void close();
- //抽象類實現的方法,final可以保證在子類不會被修改
- public final void display() {
- open(); //先open...
- for(int i=0; i < 5; i++) { //反復輸出5次
- print();
- }
- close(); //輸出完畢,close
- }
- }
2.字符類,輸出單個字符
- package com.pattern.templateMethod;
- public class CharDisplay extends AbstractDisplay {
- private char ch; //應輸出的字符
- public CharDisplay(char ch) { //把構造函數傳遞過來的字符ch,存儲在字段內
- this.ch = ch;
- }
- public void open() {
- System.out.print("<<"); //輸出"<<"作為開始字符串
- }
- public void close() {
- System.out.println(">>"); //輸出 ">>"作為結束字符串
- }
- public void print() {
- System.out.print(ch); //輸出存儲在字段的字符
- }
- }
3.字符串類,輸出字符串
- package com.pattern.templateMethod;
- /**
- *
- * @author administrator
- */
- public class StringDisplay extends AbstractDisplay {
- private String string; //應輸出的字符串
- private int width; //以byte為單位所求出的字符串的"長度"
- public StringDisplay(String string) {
- this.string =string;
- width = string.getBytes().length;
- }
- public void open() { //打印頭裝飾字符串
- printLine();
- }
- public void print() { //打印內容
- System.out.println("|"+string+"|");
- }
- public void close() { //打印尾裝飾字符串
- printLine();
- }
- public void printLine() {
- System.out.print("+"); //輸出"+"號表示邊框位置
- for(int i=0; i < width; ++i) {
- System.out.print("-"); //當作線段
- }
- System.out.println("+"); //輸出"+"號表示邊框位置
- }
- }
4.測試類
- package com.pattern.templateMethod;
- public class Main {
- public static void main(String[] args) {
- //建立1個有'A'的CharDisplay的對象
- AbstractDisplay d1 = new CharDisplay('A');
- //建立1個有"Hello world"的StringDisplay的對象
- AbstractDisplay d2 = new StringDisplay("Hello World");
- //d1,d2都是AbstractDisplay的子類對象,可以調用繼承到的display()方法
- d1.display();
- d2.display();
- }
- }
輸出:
- <<AAAAA>>
- +-----------+
- |Hello World|
- |Hello World|
- |Hello World|
- |Hello World|
- |Hello World|
- +-----------+
設計思想:
作為模板的方法定義在父類(父類為抽象類),而方法定義使用抽象方法,實現抽象方法的是子類,要在子類實現方法,才能決定具體的操作。如果在不同的子類執行不同實現就可以發展出不同的處理內容。不過,無論在哪個子類執行任何一種實現,處理的大致流程都還是要依照父類制定的方式。