刚开始编程时,没有经验,往往在一个方法里把所有的功能实现。
比如一个打印报表的模块,在实现时:
public class printReport
{
public void print(){
//打印表头
//打印正文
//打印表尾
}
}
这样客户端调用的时候,直接new printReport()对象,然后调用print方法。现在看起来没什么问题,可是需求变化时,就麻烦了。
比如客户打印表头要改一下,怎么办,改原来的类?那如果客户又觉的原来的格式好要换回原来的表头呢?这时候恐怕就要郁闷了。那怎么办呢?仔细分析发现打印次序是不变的,客户具体的打印内容是经常变化的,这样我们改造一下类:
public abstract class printReport
{ //定义一个抽象类
public void print(){
printHeader(); //打印抬头
printBody(); //打印正文
printFooter(); //打印表尾
}
public abstract void printHeader();
public abstract void printBody();
public abstract void printFooter();
}
这个框架就是把打印的3个方法固定了,但是没有具体的打印实现,因为客户的要求会变,所以这里将可变的部分抽离,留给子类去实现。
比如客户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();
这其实就是最简单的模板模式。
======================================================
在实际的打印文档项目中,有一个打印处理模块,应用了模板设计模式。
1,定义一个打印文档处理抽象类,里面BuildNewSql() 和 Process()实现了具体的流程。
2,Word的打印文档处理。
3,Excel的打印文档处理
在具体业务处理时:
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);