iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
自我挑戰組

設計模式探索系列 第 29

[Day 29] 樣板方法模式 (3)

  • 分享至 

  • xImage
  •  

實際使用中的樣板方法

書中舉了 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()...
}

在這個例子中,它的結構如下:
https://ithelp.ithome.com.tw/upload/images/20221014/20140096cOgWH8n0CZ.png

雖然不是使用繼承的方式來指定 Duck 要實作 compareTo() ,這也是變形的樣本方法模式。它的核心精神是定義一個演算法,並讓其他呼叫的人來進行部分步驟的實作

樣板方法模式與策略模式

再度回顧一下第一章的策略模式 (可參考),兩者有些相像,策略模式是定義一個演算法家族,讓彼此可以互換,因為各演算法已被封裝;而樣板方法模式則是定義演算法的大鋼,讓子類別來做部分的工作;相較起來,樣板方法模式具有較多對演算法的控制權,不會造成重複的程式碼,但策略模式較為靈活,可以在執行期抽換內容。因此樣板方法模式較適合用在演算法骨架一致的情形,且不會再隨便抽換。


上一篇
[Day 28] 樣板方法模式 (2)
下一篇
[Day 30] To be continued...
系列文
設計模式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言