刚开始编程时,没有经验,往往在一个方法里把所有的功能实现。
比如一个打印报表的模块,在实现时:

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