書中舉了 Java API 實際使用樣板方法的例子,其中一個是排序的sort()
。sort()
是一個靜態方法,而要使用這個排序方法,就要求使用時就實作compareTo()
的介面即可。我們可以在其中定義我們要的規則,例如以下,我們要來排序"鴨子"(作者真的很喜歡拿鴨子舉例XD),而鴨子的實作中就需要加入compareTo()
的定義:(以下為java程式碼)
public int comapreTo(Duck otherDuck)
{
if (this.weight < otherDuck.weight)
{
return -1;
}
else if (this.weight == otherDuck.weight)
{
return 0;
}
else
{
return 1;
}
}
那後續在呼叫sort()
樣板方法是如何運作的?可以看到sort()
中的架構其實是長這樣的,當我們呼叫sort()
來排序一個arrays時,例如Arrays.sort(ducks)
(ducks是一個array,我們來排序一串鴨子),它裡面的邏輯長這樣:
for(int i=low; iMhigh; ++i)
{
...compareTo()...
...swap()...
}
在這個例子中,它的結構如下:
雖然不是使用繼承的方式來指定 Duck
要實作 compareTo()
,這也是變形的樣本方法模式。它的核心精神是定義一個演算法,並讓其他呼叫的人來進行部分步驟的實作。
再度回顧一下第一章的策略模式 (可參考),兩者有些相像,策略模式是定義一個演算法家族,讓彼此可以互換,因為各演算法已被封裝;而樣板方法模式則是定義演算法的大鋼,讓子類別來做部分的工作;相較起來,樣板方法模式具有較多對演算法的控制權,不會造成重複的程式碼,但策略模式較為靈活,可以在執行期抽換內容。因此樣板方法模式較適合用在演算法骨架一致的情形,且不會再隨便抽換。