剛開始編程時,沒有經驗,往往在一個方法里把所有的功能實現。
比如一個打印報表的模塊,在實現時(shi):
public class printReport
{
public void print(){
//打印表頭
//打印正文
//打印表尾
}
}
這樣客戶端調(diao)用(yong)的時候(hou),直(zhi)接new printReport()對象,然后調(diao)用(yong)print方法。現在看起來沒(mei)什么問題,可(ke)是需求變化時,就麻煩了。
比如客(ke)戶打(da)印(yin)表頭要(yao)改一(yi)(yi)下(xia),怎么辦,改原來(lai)(lai)的(de)(de)類(lei)?那(nei)如果客(ke)戶又(you)覺的(de)(de)原來(lai)(lai)的(de)(de)格式(shi)好(hao)要(yao)換回(hui)原來(lai)(lai)的(de)(de)表頭呢?這時候恐怕就要(yao)郁(yu)悶了。那(nei)怎么辦呢?仔細分析發現(xian)打(da)印(yin)次序(xu)是(shi)不變(bian)的(de)(de),客(ke)戶具(ju)體的(de)(de)打(da)印(yin)內容是(shi)經常(chang)變(bian)化的(de)(de),這樣(yang)我們改造一(yi)(yi)下(xia)類(lei):
public abstract class printReport
{ //定義一個抽象類
public void print(){
printHeader(); //打印抬頭
printBody(); //打印正文
printFooter(); //打印表尾
}
public abstract void printHeader();
public abstract void printBody();
public abstract void printFooter();
}
這(zhe)個(ge)框(kuang)架就是把打(da)印的3個(ge)方法固定了,但(dan)是沒(mei)有具(ju)體的打(da)印實現,因為客戶(hu)的要求會(hui)變,所以這(zhe)里將(jiang)可變的部分(fen)抽離,留給(gei)子類(lei)去實現。
比如客戶A的打印(yin)是這樣的
public class printClientAReport:printReport //繼承
{
public void printHeader()
{
console.writeln("客戶A的抬頭打印");
}
public void printBody()
{
console.writeln("客戶A的正文打印");
}
public void printFooter()
{
console.writeln("客戶A的表尾打印");
}
}
這樣在客戶代碼
printClientAReport p=new printClientAReport();
p.print();
客戶b的不一樣
public class printClientBReport:printReport //繼承
{
public void printHeader()
{
console.writeln("客戶B的抬頭打印");
}
public void printBody()
{
console.writeln("客戶B的正文打印");
}
public void printFooter()
{
console.writeln("客戶B的表尾打印");
}
}
客戶B的打印
printClientBReport p=new printClientBReport();
p.print();
這其實就是最簡單的模板模式。
======================================================
在實際(ji)的打印(yin)文檔項(xiang)目(mu)中,有一個打印(yin)處理模塊,應用了模板設計(ji)模式。
1,定義一個(ge)打(da)印文檔處(chu)理抽象類,里面BuildNewSql() 和 Process()實現了具(ju)體的(de)流程。
2,Word的打印文檔處理。
3,Excel的打印文檔處理(li)
在具體業務處理時:
excel處理
ExcelProcess xls = new ExcelProcess(u,v,w,x,y);
xls.initProcess();
xls.Save(newname);
word處理
WordProcess wp = new WordProcess(u,v,w,x,y);
wp.initProcess();
wp.Save(newname);