在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類。模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
好萊塢原則:別呼叫(打**給)我們,我們會呼叫(打**給)你。現在你有兩種沖泡飲料,分別是咖啡和茶。(由高層元件決定低層元件的行為,而不是反過來)
咖啡的沖泡過程:
1. 把水煮沸
2. 用沸水沖泡咖啡
3. 把咖啡倒進杯子
4. 加糖和牛奶
茶的沖泡過程:
1. 把水煮沸
2. 用沸水浸泡茶葉
3. 把茶倒進杯子
4. 加檸檬
然後是實現它們的過程:
衝咖啡:
class coffee
public
void
boilwater()
public
void
brewcoffeegrinds()
public
void
pourincup()
public
void
addsugarandmilk()
}
沖茶:
class tea
public
void
boilwater()
public
void
steepteabag()
public
void
pourincup()
public
void
addlemon()
}
飲料抽象類,其中 1、3 兩步都是子類共有的:
abstract class beverage
public
void
boilwater()
public
abstract
void
brew();
public
void
pourincup()
public
abstract
void
addcondiments();
}
然後是繼承飲料的咖啡:
class coffee extends beverage
public
void
addcondiments()
}
茶:
class tea extends beverage
public
void
addcondiments()
}
測試
public
static
void
main(string args)
在上面的栗子中,飲料被強制加入了調味料,但是有時我們就想喝純咖啡或者純茶,怎麼辦呢? => 可以使用鉤子讓使用者決定是否加調味料。
abstract class beverage
}public
void
boilwater()
public
abstract
void
brew();
public
void
pourincup()
public
abstract
void
addcondiments();
// 該函式就相當於乙個鉤子
// 子類可以覆蓋該方法從而決定使用者是否加調味料
public
boolean
customerwantscondiments()
}
Head First 設計模式筆記
將變化部分和不變部分分離出來,讓 適應變化 封裝變化 針對介面程式設計,而不是針對實現程式設計 即,將一類行為抽象成行為類介面,可以應對變化,符合原則1 多用組合,少用繼承 這條原則,是建立在原則2的基礎上的,好處是系統有很大的彈性,執行時可以動態改變物件的行為 例如 策略模式 定義演算法簇 學會使...
Head First 設計模式筆記
1.找出應用中可能變化的地方,將它們獨立出來。不要和那些不需要變化的部分混在一起 2.針對介面程式設計,而不是針對實現程式設計 針對 介面程式設計 的意思是 針對超型別程式設計 針對介面程式設計關鍵在於多型。利用多型程式設計師可以針對超型別程式設計,編譯器執行會根據實際情況執行到真正的行為,而不會將...
head first 設計模式 工廠模式筆記
工廠模式 是舉了個做pizza的例子 有pizzastore抽象類裡邊有個pizza物件變數,orderpizza中裡面有個方法 叫做createpizza,同時外面定義了乙個createpizza抽象方法,然後實現裡面有個方法 叫做createpizza,此方法更具不同的引數new不同的對 象,如...