Template技术可以很大限度的重用一些资源。其基本思想是将公用资源抽取出来进行复用,将变化资源剥离出去,最后二者融合在一起,共同作用产生最后的结果。常见的Template技术用在2个方面,一个是程序代码Template-即我们常说的Template设计模式;另一个方面是文档复用-即常见的TemplateEngine,ReportEngine。
1. Template设计模式
1.1 Template设计模式
Tempate设计模式一种非常有用的设计模式,人们通常使用他构建某个算法的骨架。将算法中易变的部分抽象成抽象方法(或者提供默认实现,子类可以重载)留待子类来实现。对于子类而言,只是需要重载父类中抽象方法。这样整个算法的框架就不会发生变化。同时减少了子类的代码量。请参看如下类图:
从上图可以看出来,AbstractClass的templateMethod()方法规定了整个算法的框架,其中定义了2个抽象方法operation1(),operation2()留待子类来实现。ConceteClassA,ConcreteClassB这2个子类继承AbstractClass,独立的分别来实现抽象父类中定义的2个抽象方法。这样当我们实例化不同ConceteClassA,ConcreteClassB的实例,就可以得到不同的算法运行结构。
1.2 Template设计模式扩展
当我们将Template设计模式和CallBack设计模式一起来使用的,可以现实更加灵活的算法,流程处理。Spring框架将这种设计模式的作用发挥到了及至。我们来看其中的一个例子:如何利用这种设计模式来简化Hibernate的使用。参看代码片断:
在使用Hibernate的时候,一般的过程是首先获取session 对象,然是使用session去操作数据库。最后还要处理session的生命周期。为了简化这种操作,HibernateTemplate的execute()方法中管理了这个session的声明周期。将数据库操作放在实现HibernateCallback接口的类中实现。这样以来HibernateCallback的实现类只需要使用session只做数据库相关的操作,而不需要去处理Session之类的其他问题。
2. 文档复用
在文档中,通常有许多的内容是一样的,只是其中有一部分内容不太一样。如何能有效的复用文档中的重复内容呢?一种常见的思路是:将文档中的重复部分做成模板,将文档中变化的部分作为数据抽象出来,在真正需要生成文档的时候,将二者merge起来。这样就可以最终产生我们所需要的文档。所以最终的文档=模板+数据。下图或许可以表达这样的思想:
2.1 Template Engine
Template Engine是一种专门做文件复用的Engine。其基本思想就是一种Template的文档复用思想。但是Template Engine通常还有更多的功能。
×支持多种文档格式的输出,例如:html , xml , pdf等其他code source
× 支持脚本语言。为了能让Template具有某些数据处理功能,通常Template Engine还支持一些脚本语言。
在Java行业,常见的2款Open Source的Template Engine有Velocity和Freemaker