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