剛開始編程時(shí),沒有經(jīng)驗(yàn),往往在一個(gè)方法里把所有的功能實(shí)現(xiàn)。
比如一個(gè)打印報(bào)表的模塊,在實(shí)現(xiàn)時(shí):
public class printReport
{
public void print(){
//打印表頭
//打印正文
//打印表尾
}
}
這樣客戶端調(diào)用的時(shí)候,直接new printReport()對象,然后調(diào)用print方法,F(xiàn)在看起來沒什么問題,可是需求變化時(shí),就麻煩了。
比如客戶打印表頭要改一下,怎么辦,改原來的類?那如果客戶又覺的原來的格式好要換回原來的表頭呢?這時(shí)候恐怕就要郁悶了。那怎么辦呢?仔細(xì)分析發(fā)現(xiàn)打印次序是不變的,客戶具體的打印內(nèi)容是經(jīng)常變化的,這樣我們改造一下類:
public abstract class printReport
{ //定義一個(gè)抽象類
public void print(){
printHeader(); //打印抬頭
printBody(); //打印正文
printFooter(); //打印表尾
}
public abstract void printHeader();
public abstract void printBody();
public abstract void printFooter();
}
這個(gè)框架就是把打印的3個(gè)方法固定了,但是沒有具體的打印實(shí)現(xiàn),因?yàn)榭蛻舻囊髸?huì)變,所以這里將可變的部分抽離,留給子類去實(shí)現(xiàn)。
比如客戶A的打印是這樣的
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();
這其實(shí)就是最簡單的模板模式。
======================================================
在實(shí)際的打印文檔項(xiàng)目中,有一個(gè)打印處理模塊,應(yīng)用了模板設(shè)計(jì)模式。
1,定義一個(gè)打印文檔處理抽象類,里面BuildNewSql() 和 Process()實(shí)現(xiàn)了具體的流程。
2,Word的打印文檔處理。
3,Excel的打印文檔處理
在具體業(yè)務(wù)處理時(shí):
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);