2. 模式的結構與實現
3. 模式在開源軟體中的應用
在物件導向程式設計過程中,程式設計師常常會遇到這種情況:設計乙個系統時知道了演算法所需的關鍵步驟,而且確定了這些步驟的執行順序,但某些步驟的具體實現還未知,或者說某些步驟的實現與具體的環境相關。模版方法模式(template):定義乙個操作的演算法骨架,將演算法的一些步驟延遲到子類中,使得子類可以在不改變演算法結構的情況下,重新定義該演算法的某些特定步驟。
模版方法模式的優點有:
1. 它封裝了不變部分,擴充套件了可變部分。它吧不變的部分封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件;
2. 它在父類中提取了公共部分,便於**的復用;
3. 部分方法由子類實現,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。
模版方法模式的缺點有:
1. 對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象;
2. 繼承關係自身缺點,如果父類增加新的抽象方法,所有子類都要改變。
1. 一次性實現乙個演算法的不變部分,並將可變行為留給子類來實現;
2. 各子類中公共的行為被提取出來並集中到乙個公共父類中,從而避免**重複。
模版方法模式的主要角色如下:
1. 抽象父類(abstract class):負責給出乙個演算法的輪廓和骨架,它由乙個模版方法和若干基本方法組成,這些方法的定義如下:
1.1 模版方法:定義了演算法的骨架,按某種順序呼叫其包含的基本方法;
1.2 基本方法:是整個演算法中的乙個步驟,包含以下幾種型別:
1.2.1 抽象方法:在抽象類中宣告,由子類去實現;
1.2.2 具體方法:在抽象類中已實現,可在子類中繼承或重寫;
1.2.3 鉤子方法:在抽象類中已經實現,包括用於判斷的邏輯方法和需要子類重寫的空方法兩種。
2. 具體子類(concrete class):實現抽象類中所定義的抽象方法和鉤子方法。
抽象父類
/**
* 抽象父類 - 銀行業務
*/public
abstract
class
bankservice
}final
void
takenumber()
final
void
lineup()
/** * 辦理業務
*/abstract
void
work()
;/**
* 鉤子方法:是否評分
* @return
*/protected
boolean
needscore()
final
void
score()
}
具體子類
/**
* 老闆轉賬
*/public
class
boss
extends
bankservice
@override
protected
boolean
needscore()
}/**
* 工人存錢
*/public
class
worker
extends
bankservice
}
客戶端
public
class
client
}# 執行結果如下:
首先,取號...
其次,排隊中...
老闆來辦轉賬業務...
最後,給工作人員評分...
首先,取號...
其次,排隊中...
工人辦理存錢業務.
..
public
abstract
class
abstractlist
extends
abstractcollection
implements
list
abstract
public e get
(int index)
;public e set
(int index, e element)
public
void
add(
int index, e element)
public e remove
(int index)
public
intindexof
(object o)
else
return-1
;}public
intlastindexof
(object o)
else
return-1
;}public
void
clear()
public
boolean
addall
(int index, collection<
?extends
e> c)
return modified;
}}
在 abstractlist 中不僅已經實現了部分方法,而且還宣告了很多空方法待子類去重寫,相同的還有 abstractset 和 abstractmap 等。 設計模式之模版方法
在程式設計過程中,會有這樣的情況 乙個模組下的幾個功能,可以分幾個相同的工序,則利用模版方法,可以將這些工序提煉出來,而每個工序的具體實現,推遲到子類中實現。1.在abstractclass類中,存在乙個模版方法,是乙個普通方法,實現了一類演算法的骨架,定義了工序的執行順序 2.concreatec...
設計模式之模版方法
設計模式之模版方法 定義演算法的骨架,將具體操作放在子類去實現。例 去銀行取錢的操作。1.去哪個銀行?2.取多少錢?例項 抽象類 取錢 public abstract class getmoney 實現類 public class getmoneyimpl extends getmoney 取錢的動...
大話設計模式之模版方法模式
模版方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的默寫特定步驟。abstrclass定義並實現了乙個模版方法。這個模版方法一般是乙個具體方法,它給出了乙個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實...