C10) Template(模板模式)
定義:定義一個(gè)操作的算法的框架,將一些步驟的實(shí)現推遲到子類(lèi)。模板模式在不改變算法結構的前提下,允許子類(lèi)重定義算法的某些步驟。
模板模式非常好的利用了繼承重載的特性,先給出操作要實(shí)現的步驟大綱,暫緩某些步驟的實(shí)現,把這部分交由不同的子類(lèi)來(lái)完成。這個(gè)模式就像平時(shí)常做的填寫(xiě)表格,表格就是模板,每張填寫(xiě)好的表格都是這個(gè)模板的一個(gè)子類(lèi)。
現在假設要實(shí)現一個(gè)數據復制的功能,我們將這個(gè)功能分為幾個(gè)步驟:1)打開(kāi)數據源和目標 3)讀取數據 4)數據格式化 5)寫(xiě)入數據 6)關(guān)閉,生成模板類(lèi)如下
public abstract class CopyTemplate {
public abstract void open();
public abstract void getData();
public abstract void formatData();
public abstract void putData();
public abstract void close();
public void doCopy() {
open();
getData();
formatData();
putData();
close();
}
}
接下來(lái),需要實(shí)現一個(gè)從數據庫復制到文件的功能
public class DB2File extends CopyTemplate {
public void open() {
//建立數據庫連接
//創(chuàng )建文件訪(fǎng)問(wèn)對象
}
public void getData() {
//查詢(xún)操作,取得ResultSet
}
public void formatData() {
//格式化數據
}
public void putData() {
//寫(xiě)文件
}
public void close() {
//關(guān)閉數據庫連接
//關(guān)閉文件訪(fǎng)問(wèn)對象
}
}
如果需要文件向數據庫復制
public class File2DB extends CopyTemplate {
public void open() {
//建立數據庫連接
//創(chuàng )建文件訪(fǎng)問(wèn)對象
}
public void getData() {
//讀文件
}
public void formatData() {
//格式化數據
}
public void putData() {
//生成InsertQuery并執行
}
public void close() {
//關(guān)閉數據庫連接
//關(guān)閉文件訪(fǎng)問(wèn)對象
}
}
調用的時(shí)候
CopyTemplate action1 = new DB2File();
action1.doCopy();
CopyTemplate action2 = new File2DB();
action2.doCopy();
上面模板用到了抽象類(lèi),主要是為了強制子類(lèi)實(shí)現。對于doCopy()方法,可以加上final關(guān)鍵字聲明,這樣子類(lèi)就無(wú)法重載了。
參考:
1、 http://www.jdon.com/designpatterns/template.htm(中文、java實(shí)例)
2、 http://www.dofactory.com/Patterns/PatternCommand.aspx(英文、C#實(shí)例、UML)
3、 http://www.caterpillar.onlyfun.net/PmWiki/pmwiki.php/DesignPattern/TemplateMethod(中文、java實(shí)例、UML)推薦
4、 http://www.techscore.com/tech/DesignPattern/TemplateMethod.html(日文、java實(shí)例、UML)推薦
聯(lián)系客服