標籤:
模板是指在薄片塑料板上面寫字後挖空,再使用毛筆或色筆塗滿挖空部分,就能看到純手工而以不失工整的字樣,看到模板上的挖空形狀,馬上就知道最後會變出什麼樣子的字,不過實際上所顯現出來的字樣還是要依所使用的畫筆種類而定.拿黑色簽字筆當畫筆,結果當然就是簽字筆的字樣;當用鉛筆來畫,得到的也只會是灰黑色的鉛筆字;如果用五顏六色的彩色筆,自然能創出讓人眼花的多色字.但是,無論使用哪種文具,製作出來的字樣都還是脫不了模板上已經固定的形狀。
下面我們用例子說明模板方法
程式樣本類之間的關係
1.模板類,相當於我們上面提到的薄片塑料板
Java代碼
- 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.字元類,輸出單個字元
Java代碼
- 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.字串類,輸出字串
Java代碼
- 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.測試類別
Java代碼
- 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();
- }
- }
輸出:
C代碼
- <<AAAAA>>
- +-----------+
- |Hello World|
- |Hello World|
- |Hello World|
- |Hello World|
- |Hello World|
- +-----------+
設計思想:
作為模板的方法定義在父類(父類為抽象類別),而方法定義使用抽象方法,實現抽象方法的是子類,要在子類實現方法,才能決定具體的操作。如果在不同的子類執行不同實現就可以發展出不同的處理內容。不過,無論在哪個子類執行任何一種實現,處理的大致流程都還是要依照父類制定的方式。
Java設計模式—模板方法(Template Method)