Android設計模式系列 模板方法模式

2021-06-21 11:32:47 字數 1914 閱讀 2198



2013-11-26 17:15 佚名

字型大小:t |

t 我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下並不被推薦使用,但是這種通過父類呼叫子類的方法,使用繼承來改變演算法的一部分,是物件導向的一種基本認識。

模板方法,和單例模式是我認為gof的23中最簡單的兩種模式。

但是我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下並不被推薦使用,但是這種通過父類呼叫子類的方法,使用繼承來改變演算法的一部分,是物件導向的一種基本認識。

打比方說父親有很多理想,就行醫救人吧,但是父親醫術不行,只能靠兒子,兒子長大後遵從父親大志,春風拂面,妙手回春,實現了父親的理想,兒子做的事情早在出生前就定下來了,是父親之前久定好的模板。

認識到模板方法的這種思想,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情,對框架學習大有幫助。

本文以view中的draw方法為例,展開分析。

模板方法,templatemethod,光是學習這個模式,就會對你產生長遠影響的乙個模式。

1.意圖

定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。 

熱門詞彙:骨架 步驟 結構 延遲到子類 

2.結構

定義了幾個步驟1,2,3等,在模板方法中按照一定的結構順序執行這些步驟。父類的方法可以有預設實現,也可以是乙個空實現,即所謂的鉤子操作。

結合實際情況,我們畫出view中draw方法涉及到的幾個步驟方法如下:

學習模板方法對於我們了解框架的基類實現,生命週期和流程控制非常有幫助,我覺得是務必要掌握的乙個模式。

3.**

public

class view  

/** 

*鉤子操作,空實現 

*/protected

void dispatchdraw(canvas canvas)   

//演算法骨架 

public

void draw(canvas canvas)   

}  //... ... 

}  

我們看看系統元件textview的實現:

public

class textview  

}  

如果我們自定義view的話,我們一般也是重寫ondraw方法即可:

public

class myview extends view   

@override

protected

void ondraw(canvas canvas)   

@override

protected

void dispatchdraw(canvas canvas)   

}  

4.效果(1).模板方法是一種**復用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為。

(2).模板方法導致一種方向控制結構,"好萊塢法則":"don't call me,i will call you.",即乙個父類呼叫子類的操作,而不是相反。

(3).模板呼叫操作的型別有具體的操作,具體的abstracclass操作,原語操作,工廠方法,鉤子操作。少定義原語操作。

(4).android中對這些重定義操作的命名喜歡在方法前加乙個字首on。

(5).模板方法使用繼承來改變演算法的一部分。策略模式使用委託來改變整個演算法。

Android設計模式系列 模板方法模式

模板方法,和單例模式是我認為gof的23中最簡單的兩種模式。但是我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下並不被推薦使用,但是這種通過父類呼叫子類的方法,使用繼承來改變演算法的一部分,是物件導向的一種基本認識。打比方說父親有很多理想,就行醫救人吧,但是父親醫術不行,只能靠兒子,兒...

設計模式系列 模板模式

在模板模式中,乙個抽象類公開定義了執行它的方法的方式或方法 模板模式屬於行為型模式,通過將相似的業務行為抽離出來放到抽象類中暴露給上層,然後在自己子類中實現具體的業務行為,通過模板類來約束上層的業務呼叫。1 定義抽象基類 public abstract class game 2 定義業務子類 pub...

模板方法模式 設計模式系列

模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定的步驟。定義有些呆板,說說我的理解吧。父類定義實施的步驟,子類中實現具體的演算法。當我們要完成在某一細節層次一直得乙個過程或一系列步驟,但其個別步驟在更詳細的層...