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; }
} |