模板方法模式

2021-06-22 20:50:05 字數 2116 閱讀 5386

繼承:

作為物件導向三大特性之一的繼承,功能不是一般的強大,在書的

344頁

《大話設計模式》我們可以看到

cat和

dog類**內容基本形同,只是在叫的時候發出的聲音不同罷了,如果現在我們要新增別的動物,比如兔子,豬

...等等,則需要寫相同的**(複製)只是改改各自的叫聲罷了。

我們知道一條程式設計的原則就是盡可能的避免重複,比較四個類,可以抽象出

animal

這個類作為父類把相同的**放在父類中,然後子類通過多型實現對叫聲

shout()

方法的重寫實現各自的叫聲。

繼承的好處:子類擁有父類非

private

的屬性和功能;子類是父類的特殊化;子類可以對父類的方法進行重寫。

模板方法模式:

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

說白了就是幾個類的主要**基本相同,只是個別步驟的演算法不同。我們用模板模式對**進行重構。

以老師在黑板上抄題,學生抄寫題目並寫出相應的答案為例。

**結構圖

//學生甲的試卷

classtest*****a

//試題2

public vodi testquestion2()

//試題3

public vodi testquestion3()

}

//學生乙的試卷

classtest*****a

//試題2

public vodi testquestion2()

//試題3

public vodi testquestion3()

}

比較甲乙抄寫試卷的**我們知道,試卷中的試題是相同的不同的只是甲乙各自的答案

console.writeline("")

不同。確切的說是輸出的答案(

a.b.c.d

)不同,而

console.writeline()

方法還是子類所共有的。

我們已經知道重複的危害,容易出錯,而且在修改的時候很困難。所以下面我們要做的就是提煉**,將相同的**提到乙個共有的父類中。

優化後

**結構圖

protected virtual stringanswer1() /讓子類重寫該方法

} //試題2

public vodi testquestion2()

protected virtual string answer2()

//試題3

public vodi testquestion3()

protected virtual string answer()

子類的**

//甲類

classtest*****a : test*****

protected override string answer2

protected override string answer3

}

乙類**和甲類相同只是在輸出答案的時候不同。

客戶端**:

static void main(string args)

模板方法模式通過把不變的行為搬移到超類中去除了子類中的重複**,提供了乙個很好的**復用平台。

總結模板模式充分體現了繼承的好處,通過提取不變的行為抽象為父類,從而簡化的**的重複,優化了系統的結構,是我們很常用的模式。

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...