關鍵詞 :hook 鈎子 Applet 中 init() destory() 為鈎子,需要子類去實作。
新原則: 别調用我們,我們會調用你們 高層調用低層 低層不能調用高層。
目的 :封裝算法
模闆方法:子類決定如何實作算法中的步驟
政策:封裝可互換的行為,然後使用委托來決定要采用哪一個行為
工廠方法:由子類決定執行個體化哪個具體類
OO原則:新原則上面
OO模式:模闆方法模式:在一個方法中定義一個算法的骨架,而将一些步驟延遲到子類。模闆方法使得子類可以在不改變算法的結構的情況下,重新定義算法中的某些步驟。
//對模闆方法進行挂鈎
鈎子是一種被聲明在抽象類中的方法,但隻有空的或者預設的實作。鈎子的存在,可以讓子類有能力對算法的不同點進行挂鈎。要不要挂鈎,由子類決定。
鈎子可以做為條件控制語句,影響抽象類中的算法流程。
鈎子的另一個用法,是讓子類能夠有機會對模闆方法中某些即将發生的(或剛剛發生的)步驟作出反應。
新原則和依賴倒置原則:依賴倒置原則教我們盡量避免使用具休類,而多使用抽象類。
新原則是用在建立架構或元件上的一種技巧,好讓低層元件能夠被挂鈎進計算中,而且又不會讓高層元件依賴低層元件。兩者的目标都是在于解耦。
JavaAPI 中的 模闆方法
Arrays.Sort()
Java數組類的設計者提供一個模闆方法用來排序。 下面是簡化代碼
數組無法繼承,是以如何使用sort() ?
sort()的設計者希望這個方法能用于所有的數組,是以把sort()變成靜态的方法,這樣任何數組都能使用這個方法。
因為sort()并不是真正定義在超類中,是以sort()方法需要知道你已經實作了這個compareTo()方法,否則無法進行排序。
是以數組中要排序的對象需要實作 Comparable接口。
例子: 比較鴨子
開始排序
要點:
(1)“模闆方法”定義了算法的步驟,把這些步驟的實作延遲到子類
(2)模闆方法模式為我們提供了一種代碼複用的重要技巧。
(3)模闆方法的抽象類可以定義具體方法,抽象方法和鈎子。
(4)抽象方法由子類實作。
(5)鈎子是一種方法,它在抽象類中不做事,或者隻做預設的事情,子類可以選擇要不要去覆寫它。
(6)為了防止子類改變模闆方法中的算法,可以将模闆方法聲明為final
(7)好萊塢原則告訴我們,将決策權放在高層子產品中,以便決定如何以及何時調用低層子產品。
(8)你将在真實世界代碼中看到模闆方法模式的許多變體,不要期待它們全都是一眼就可以被你認出的。
(9)政策模式和模闆方法模式都封裝算法,一個用組合,一個用繼承。
(10)工廠方法是模闆方法的一種特殊版本。
政策VS 模闆
政策:我定義一個算法家族,并讓這些算法可以互換。正因為每一個算法都被封裝起來了,是以客戶可以輕易地使用不同的算法。
模闆:我定義一個算法大鋼,而由我的子類定義其中某些步驟可以有不同的實作細節。但是我的算法結構依然維持不變。
模闆依賴性高一些,必須依賴超類中算法的實作,因為這是算法的一部分。
政策不依賴任何,整個算法自己搞定。