模板模式(template patern),是在乙個方法中定義了乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法中使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
模板就是乙個方法,這個方法將演算法定義成一組步驟,為了不被子類改變,這個方法通常被限制為final型別。另外還有乙個鉤子(hook)的概念,所謂的「鉤子」就是預設不做事的方法,這個方法在抽象類中是不實現的或者為空,子類可以決定是否要覆蓋它,自然,這個方法的呼叫是在「模板」方法中。
當子類必須提供「模板」中某個方法的實現時,這個方法就在父類中定義為抽象方法;如果這個方法是可選的,或者對於子類的實現不重要的時候,就使用鉤子來控制。使用鉤子,可以讓子類對模板方法中即將發生的步驟做出反應。
來個示例,其實網上很多例子了,做飯的例子、燒菜的例子、泡咖啡泡茶的例子,等等,都是為了說明模板模式的用法。在這裡就不說那些例子了,自己寫個玩完,純粹練手。
現在安卓手機應用非常多,但是都需要首先安裝到手機上才能使用,在安裝的時候,我們抽象一下,一般需要這麼幾個步驟:申請安裝許可權、建立相應目錄、註冊服務、選擇是否開機啟動等。我們以這個為例子,說明下模板模式的使用。
首先是建立個抽象類,用於描述所有的安裝步驟:
1package org.scott.template;
2/**3*
@author
scott
4* @date 2023年12月25日
5* @description6*/
7public
abstract
class setup
1617 printmsg();
18 }
1920
public
abstract
void getauthority();
21public
abstract
void createdir();
22public
abstract
void registerservice();
2324
public
boolean isautostart();
2728
public
void printmsg()
3132
private
void autostart()
35 }
這裡的setup方法是final型別的,就是我們上面說的"模板"方法,其中定義了各個演算法,就是安裝步驟,包括獲取許可權、建立目錄、註冊服務、是否開機啟動等。是否開機啟動這個就是鉤子,由子類決定。
下面是具體的乙個實現,有道筆記的安裝:
1package org.scott.template;
2/**3*
@author
scott
4* @date 2023年12月25日
5* @description6*/
7public
class youdaosetup extends setup
1314 @override
15public
void createdir()
1819 @override
20public
void registerservice()
2324 @override
25public
boolean isautostart()
2829 }
這裡的實現,我們覆寫了isautostart方法,將其設定為true,將當前此軟體加入開機自啟列表中。鉤子,可以在子類中覆寫,也可以直接使用父類中的預設實現。下面的qq安裝,就是使用的預設實現:
1package org.scott.template;
2/**3*
@author
scott
4* @date 2023年12月25日
5* @description6*/
7public
class qqsetup extends setup
1314 @override
15public
void createdir()
1819 @override
20public
void registerservice()
23 }
以上基本上就是抽象模板和具體模板的實現,模板方法實際上在子類中都沒有修改,因為我們把它設定成了final型,子類所修改的就是模板方法中的一些具體的實現演算法,比如不同的軟體,它的安裝目錄、註冊的服務都是不同,我們把這些都作為抽象方法,子類必須實現自己的特定方法。
寫個測試類:
1package org.scott.template;
2/**3*
@author
scott
4* @date 2023年12月25日
5* @description6*/
7public
class templatetest
1718 }
測試結果:
1 has got the set up authority.
2 create qq directory.
3 register the qq service.
56 ---------------------------
78 has got the set up authority.
9 create youdao directory.
10 register the youdao service.
通過上面的例子,我們可以看到,使用模板方式時,有兩個角色:
(1)抽象模板角色:定義了乙個或多個抽象操作,以便讓子類實現,這些抽象操作稱為基本操作。
(2)具體模板角色:實現父類所定義的乙個或多個抽象方法。
模板模式主要實現了**復用,符合開放-封閉原則,因為引入了乙個抽象類,所以如果具體實現過多的話,類之間的關係是複雜點。
模板設計模式 設計模式之模板模式
模板模式,通常又叫做模板方法模式,乙個抽象類公開定義了執行方法的模板,它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方法進行,這種型別的設計模式屬於行為型模式。模板模式主要解決將通用的演算法抽象起來,同樣的 邏輯出現了重複,就可以使用模板模式進行重構。關鍵 在抽象類實現,其他步驟在子類實現...
設計模式之模板設計模式
模板方法模式,定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重新定義該演算法的某些特定步驟。模板方法模式是通過把不變行為搬到超類,去除子類中的重複 來體現它的優勢。當不變和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重複...
設計模式之模板設計模式
在父類中定義好演算法的骨架,然後在子類中去實現。總的來說就是父類中定義需要實現的總方法,然後在子類中去依次實現它 當然根據物件的不同,所實現的具體細節不同。下面來看乙個例子 在父類中我們定義三個抽象的方法job 在子類中去實現它。子類中執行execute方法 job1 如果當前時間能整除2 則執行j...