1. 程式人生 > >設計模式(Java)—Template Method模式

設計模式(Java)—Template Method模式

Template模式是在父類中定義處理流程的框架,在子類中實現具體處理的模式。

一、示例程式
將字元和字串迴圈顯示5次的程式
這裡寫圖片描述

在AbstractDisplay類中定義了display方法,而且在該方法中依次呼叫open、print、close這3個方法,雖然這3個方法已經在AbstractDisplay中被聲明瞭,但都是沒有屍體的抽象方法。這裡呼叫抽象方法的display方法就是模板方法。
而實際上實現了open、print、close這3個抽象方法的是AbstractDisplay的子類CharDisplay類和StringDisplay類。

AbstractDisplay類:

package TemplateMethod;

//抽象模板中使用抽象而不是用介面的原因是,抽象模板的父類中有模板方法,模板方法不是抽象方法,而介面中的方法要求全部是抽象的,
//所以這裡不能使用介面,介面中是無法實現方法的
//抽象類中既可以有抽象方法,也可以有普通方法
public abstract class AbstractDisplay {
    public abstract void open();
    public abstract void print();
    public abstract void close();
    //final欄位在繼承該類的子類中此方法不能被重寫
public final void display(){ open(); for(int i=0;i<5;i++){ print(); } close(); } }

CharDisplay類:

package TemplateMethod;

//抽象類的子類,繼承抽象類,實現抽象方法
public class CharDisplay extends AbstractDisplay {
    private char ch;
    public CharDisplay(char
ch) { // TODO Auto-generated constructor stub this.ch = ch; } @Override public void open() { // TODO Auto-generated method stub System.out.print("<<"); } @Override public void print() { // TODO Auto-generated method stub System.out.print(ch); } @Override public void close() { // TODO Auto-generated method stub System.out.println(">>"); } }

StringDisplay類:

package TemplateMethod;

//抽象類的子類,繼承抽象類,實現抽象方法
public class StringDisplay extends AbstractDisplay {
    private String string;
    private int width;
    public StringDisplay(String string) {
        // TODO Auto-generated constructor stub
        this.string = string;
        this.width = string.getBytes().length;
    }

    @Override
    public void open() {
        // TODO Auto-generated method stub
        printLine();


    }

    @Override
    public void print() {
        // TODO Auto-generated method stub
        System.out.println("|"+string+"|");

    }

    @Override
    public void close() {
        // TODO Auto-generated method stub
        printLine();

    }
    private void printLine(){
        System.out.print("+");
        for(int i=0;i<width;i++){
            System.out.print("-");
        }
        System.out.println("+");
    }
}

總結:抽象類角色不僅負責實現模板方法,還負責宣告在模板方法中所使用到的抽象方法,此處即程式流程中使用到的演算法,這些抽象方法的實現有具體類實現。
具體類負責實現抽象類角色中定義的抽象方法。