java設計模式之Template Method模式 ——將具體處理交給子類

1.Template Method模式:

在父類(抽象類)中定義處理流程的框架(父類的抽象方法),
在子類中實現具體的處理(實現父類的抽象方法)。

2.示例程序

共4個類:

AbstractDisplay :
    定義非抽象普通方法display();
    定義抽象方法open(),print(),close()(由子類實現);
    在display()中依次調用了open(),print(),close()這3個方法(即實現display());
CharDisplay:
    繼承AbstractDisplay ,實現AbstractDisplay 中的抽象方法open(),print(),close();
StringDisplay:
    繼承AbstractDisplay ,實現AbstractDisplay 中的抽象方法open(),print(),close();
Main:
    用於測試程序行爲;

類圖

這裏寫圖片描述

代碼

AbstractDisplay.java

package com.wang;

public abstract class AbstractDisplay {
    public abstract void open();
    public abstract void print();
    public abstract void close();

    public final void display(){
        open();
        for (int i = 0; i < 5; i++) {
            print();//循環調用5次
        }
        close();
    }

}

CharDisplay .java

package com.wang;

public class CharDisplay extends AbstractDisplay{
    private char ch;//需要顯示的字符
    public CharDisplay(char ch) {
        this.ch = ch;
    }

    @Override
    public void open() {
        System.out.print("<<");
    }
    @Override
    public void print() {
        System.out.print(ch);
    }
    @Override
    public void close() {
        System.out.println(">>");
    }

}

StringDisplay.java

package com.wang;

public class StringDisplay extends AbstractDisplay {
    private int width;
    private String string;

    public StringDisplay(String string) {
        this.string = string;
        this.width = string.getBytes().length;
    }

    @Override
    public void open() {
        printLine();
    }
    @Override
    public void print() {
        System.out.println("|" + string + "|");
    }
    @Override
    public void close() {
        printLine();
    }
    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < this.width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

Main .java

package com.wang;

public class Main {

    public static void main(String[] args) {
        //生成一個持有“H”的CharDisplay類實例
        AbstractDisplay d1 = new CharDisplay('H');
        //生成一個持有“Hello,world”StringDisplay類實例
        AbstractDisplay d2 = new StringDisplay("hello,world");
        //生成一個持有“你好,世界”的StringDisplay
        AbstractDisplay d3 = new StringDisplay("你好,世界.");
        d1.display();
        d2.display();
        d3.display();
    }

}

運行結果:
這裏寫圖片描述

敲黑板敲黑板

System.out.println();//最後的ln相當於/n,表示此句打印會換行。
System.out.print()則不換行打印。
抽象類作用:雖然抽象類不能生成實例看似無用,但實際上可以通過抽象方法的名字在抽象階段裏確定處理的流程,這一點也是非常重要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章