Template技術(shù)可以很大限度的重用一些資源。其基本思想是將公用資源抽取出來(lái)進(jìn)行復(fù)用,將變化資源剝離出去,最后二者融合在一起,共同作用產(chǎn)生最后的結(jié)果。常見(jiàn)的Template技術(shù)用在2個(gè)方面,一個(gè)是程序代碼Template-即我們常說(shuō)的Template設(shè)計(jì)模式;另一個(gè)方面是文檔復(fù)用-即常見(jiàn)的TemplateEngine,ReportEngine。
1. Template設(shè)計(jì)模式
1.1 Template設(shè)計(jì)模式
Tempate設(shè)計(jì)模式一種非常有用的設(shè)計(jì)模式,人們通常使用他構(gòu)建某個(gè)算法的骨架。將算法中易變的部分抽象成抽象方法(或者提供默認(rèn)實(shí)現(xiàn),子類可以重載)留待子類來(lái)實(shí)現(xiàn)。對(duì)于子類而言,只是需要重載父類中抽象方法。這樣整個(gè)算法的框架就不會(huì)發(fā)生變化。同時(shí)減少了子類的代碼量。請(qǐng)參看如下類圖:

從上圖可以看出來(lái),AbstractClass的templateMethod()方法規(guī)定了整個(gè)算法的框架,其中定義了2個(gè)抽象方法operation1(),operation2()留待子類來(lái)實(shí)現(xiàn)。ConceteClassA,ConcreteClassB這2個(gè)子類繼承AbstractClass,獨(dú)立的分別來(lái)實(shí)現(xiàn)抽象父類中定義的2個(gè)抽象方法。這樣當(dāng)我們實(shí)例化不同ConceteClassA,ConcreteClassB的實(shí)例,就可以得到不同的算法運(yùn)行結(jié)構(gòu)。
1.2 Template設(shè)計(jì)模式擴(kuò)展
當(dāng)我們將Template設(shè)計(jì)模式和CallBack設(shè)計(jì)模式一起來(lái)使用的,可以現(xiàn)實(shí)更加靈活的算法,流程處理。Spring框架將這種設(shè)計(jì)模式的作用發(fā)揮到了及至。我們來(lái)看其中的一個(gè)例子:如何利用這種設(shè)計(jì)模式來(lái)簡(jiǎn)化Hibernate的使用。參看代碼片斷:

在使用Hibernate的時(shí)候,一般的過(guò)程是首先獲取session 對(duì)象,然是使用session去操作數(shù)據(jù)庫(kù)。最后還要處理session的生命周期。為了簡(jiǎn)化這種操作,HibernateTemplate的execute()方法中管理了這個(gè)session的聲明周期。將數(shù)據(jù)庫(kù)操作放在實(shí)現(xiàn)HibernateCallback接口的類中實(shí)現(xiàn)。這樣以來(lái)HibernateCallback的實(shí)現(xiàn)類只需要使用session只做數(shù)據(jù)庫(kù)相關(guān)的操作,而不需要去處理Session之類的其他問(wèn)題。
2. 文檔復(fù)用
在文檔中,通常有許多的內(nèi)容是一樣的,只是其中有一部分內(nèi)容不太一樣。如何能有效的復(fù)用文檔中的重復(fù)內(nèi)容呢?一種常見(jiàn)的思路是:將文檔中的重復(fù)部分做成模板,將文檔中變化的部分作為數(shù)據(jù)抽象出來(lái),在真正需要生成文檔的時(shí)候,將二者merge起來(lái)。這樣就可以最終產(chǎn)生我們所需要的文檔。所以最終的文檔=模板+數(shù)據(jù)。下圖或許可以表達(dá)這樣的思想:

2.1 Template Engine
Template Engine是一種專門做文件復(fù)用的Engine。其基本思想就是一種Template的文檔復(fù)用思想。但是Template Engine通常還有更多的功能。
×支持多種文檔格式的輸出,例如:html , xml , pdf等其他code source
× 支持腳本語(yǔ)言。為了能讓Template具有某些數(shù)據(jù)處理功能,通常Template Engine還支持一些腳本語(yǔ)言。
在Java行業(yè),常見(jiàn)的2款Open Source的Template Engine有Velocity和Freemaker