Java設計模式之模板方法設計模式

1、運用

在定義功能時,功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分,那麼這時將不確定部分暴露出去,由該類的子類去完成。

2、創建模板模式步驟

1)定義一個(或者多個)抽象方法,讓子類去實現;

2)定義並實現一個模板方法,在模板方法中調用抽象方法;

3)創建抽象類的子類,實現對應的抽象方法。

3、示例:

有如下需求:想在服務器端增加一個新功能,希望寫一個方法,能對Book對象進行處理,將Book對象的所有字段以XML格式進行包裝,這樣以後可以方便與客戶端進行交互。

爲便於代碼的擴展性,便於後期的升級維護,可以使用模板方法設計模式。因爲後期可能有新需求,將Book對象以json格式進行包裝,這樣就可以針對不同的要求,由不同的子類去實現。

定義含模板方法的抽象類

public abstract class Formatter {  

  

    public String formatBook(Book book, int format) {  

        beforeFormat();  

        String result = formating(book);  

        afterFormat();  

        return result;  

    }  

  

    protected void beforeFormat() {  

        System.out.println("format begins");  

    }  

  

    protected abstract String formating(Book book);  

  

    protected void afterFormat() {  

        System.out.println("format finished");  

    }  

  

}

定義專門的子類來處理每種傳輸格式的具體邏輯,如定義子類XMLFormatter繼承自Formatter,將Book對象以xml格式進行包裝。

public class XMLFormatter extends Formatter {     

    @Override  

    protected String formating(Book book) {  

        String result = "";  

        result += "<book_name>" + book.getBookName() + "</book_name>\n";  

        result += "<pages>" + book.getPages() + "</pages>\n";  

        result += "<price>" + book.getPrice() + "</price>\n";  

        result += "<author>" + book.getAuthor() + "</author>\n";  

        result += "<isbn>" + book.getIsbn() + "</isbn>\n";  

        return result;  

    }  

  

定義類JSONFormatter繼承自Formatter,裏面加入處理JSON格式的具體邏輯:

public class JSONFormatter extends Formatter {  

  

    @Override  

    protected String formating(Book book) {  

        String result = "";  

        result += "{\n";  

        result += "\"book_name\" : \"" + book.getBookName() + "\",\n";  

        result += "\"pages\" : \"" + book.getPages() + "\",\n";  

        result += "\"price\" : \"" + book.getPrice() + "\",\n";  

        result += "\"author\" : \"" + book.getAuthor() + "\",\n";  

        result += "\"isbn\" : \"" + book.getIsbn() + "\",\n";  

        result += "}";  

        return result;  

    }  

  

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