模板方法模式(templatemethod)定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
當我們要完成在某一細節層次一致的乙個過程或一系列步驟,擔其個別步驟在更詳細的層次上的實現可能不同時,我們通常考慮用模板方法模式來處理,模板方法模式通過把不變行為搬移到超類,去除子類中的重複**來體現它的優勢。
abstractclass是抽象類,其實也就是一抽象模板,定義並實現了乙個模板方法。這個模板方法一般是乙個具體方法,它給出了乙個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現,頂級邏輯也有可能呼叫一些具體方法。
我們都知道,裝修房屋的過程分為水電泥木油,現有一支施工隊,為a、b兩座房屋裝修。假設因房屋大小不同,水、電、泥工的工程量不同,但木工與油漆工由於特殊原因,工程量是固定的。因此我們需要將水電泥的方法延遲到具體的房屋施工子類中去實現,而固定的木工與油漆工,可以提取到抽象父類中來。
先看裝修的抽象父類:
public
abstract
class
decorate
//定義一些抽象行為,放到子類中去實現
public
abstract
void
waterconstruction(); //水
public
abstract
void
electricconstruction(); //電
public
abstract
void
mudconstruction(); //泥
public
abstract string gethousename(); //獲取房屋戶主名
}
小房子的裝修類:
public
class
housea
extends
decorate
@override
public
void
electricconstruction()
@override
public
void
mudconstruction()
@override
public string gethousename()
}
大房子的裝修類:
public
class
houseb
extends
decorate
@override
public
void
electricconstruction()
@override
public
void
mudconstruction()
@override
public string gethousename()
}
public
static
void
main(string args)
水工耗時5天
電工耗時6天
泥工耗時7天
木工耗時10天
油漆工耗時15天
pzx的房屋裝修結束!
水工耗時8天
電工耗時10天
泥工耗時10天
木工耗時10天
油漆工耗時15天
zyb的房屋裝修結束!
可以看到,當不變和可變的行為在方法的子類實現中混合在一起時,不變的行為就會在子類中重複出現,我們可以通過模板方法模式把這些行為搬到單一的地方,這樣就幫助子類擺脫重複的不變行為的糾纏。
設計模式(七)模板方法模式
七 模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構,即可重定義該演算法的某些特定步驟。使用繼承,並肯定這個繼承有意義,就應該要成為子類的模板,所有重複的 都應該上公升到父類去,而不是讓每個子類都去重複。當我們要完成在某一細節層次一致的...
設計模式(七) 模板方法模式
模板方法模式結構圖 例子 1 定義模板方法類 abastractclass模板方法 public abstract class question 問題2 public void questiontwo 問題1的答案,抽象方法,具體實現交給子類 public abstract string answe...
設計模式學習 模板方法模式
型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...