直到目前,我們的議題都繞著封裝轉,我們已經封裝了物件建立、方法呼叫、複雜介面、鴨子、披薩。接下來呢?我們將要深入封裝演算法塊,好讓子類可以在任何時候都可以將自己掛接進運算裡。我們甚至會在本章學到乙個受到好萊塢影響而啟發的設計原則。
有些人沒有咖啡就活不下去,有些人則離不開茶。兩者的共同成分是什麼,當然是咖啡因啦。
讓我們扮演「**師傅「,寫一些**來建立咖啡和茶。
下面是咖啡:
public class coffee
public void boilwater()
public void brewcoffeegrinds()
public void pourincup()
public void addsugarandmilk()
}
下面是茶
public class tea
public void boilwater()
public void steepteabag()
public void addlemon()
public void pourincup()
}
我們發現了重複的**,這是好現象。這表示我們需要清理一下設計了。在這裡,既然茶和咖啡是如此的相似,似乎我們應該將共同的部分抽出來,放進乙個基類中。
現在我們有了新的preparerecipe()方法,但是需要讓它能夠符合**。要想這麼做,我們先從caffeinebeverage(咖啡因飲料:茶和咖啡)超類開始。
public abstract class caffeinebeverage
/** 因為咖啡和茶處理這些方法的做法不同,所以這兩個方法必須被宣告為抽象,由子類來實現具體方法。
*/abstract void brew();
abstract void addcondiments();
void boilwater()
void pourincup()
}
最後,我們需要處理咖啡和茶類了。這兩個類現在都是依賴超類(咖啡因飲料)來處理沖泡法,所以只需要自行處理沖泡和新增調料部分。
preparerecipe()是我們的模板方法。為什麼?
因為:1、畢竟它是乙個方法。
2、它用作乙個演算法的模板,在這個例子中,演算法是用來製作咖啡因飲料的。
在這個模板中,演算法內的每乙個步驟都被乙個方法代表了。某些方法是由這個類(超類)來處理的,某些方法則是由子類來處理。
模板方法模式:在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
鉤子是一種被宣告在抽象類中的方法,但只有空的或者預設的實現。鉤子的存在,可以讓子類有能力對演算法的不同點進行掛鉤。要不要掛鉤,由子類自行決定。
鉤子有好幾種用途,讓我們先看其中乙個,稍後再看其他幾個:
public abstract class caffeinebeveragewithhook }
abstract void brew();
abstract void addcondiments();
void boilwater()
void pourincup()
/** 我們再這裡定義了乙個方法,(通常)是空的預設實現。這個方法只會返回true,不做別的事情。
* 這就是鉤子,子類可以覆蓋這個方法,但不見得一定要這麼做。
*/boolean customerwantscondiments()
}
好萊塢原則:別呼叫(打**給)我們,我們會呼叫(打**給)你。
好萊塢原則可以給我們一種防止「依賴腐敗「的方法。當高層元件依賴低層元件,而低層元件又依賴高層元件,而高層元件又依賴邊側元件,依賴腐敗就發生了。在這種情況下,沒有人可以輕易地搞定系統是如何設計的。
在好萊塢原則之下,我們允許低層元件講自己掛鉤到系統上,但是高層元件決定什麼時候和怎麼樣使用這些低層元件。換句話說,高層元件對待低層元件的方式是」別呼叫我們,我們會呼叫你「。
實現compareto()方法即可。
模板方法從字面意思就很好理解,把握住新學的好萊塢原則,避免依賴腐敗,這個就是本章的精髓。
Chapter08 工廠方法模式
工廠方法模式 factory method 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類中。工廠方法模式在實現時,客戶端需要決定例項化哪乙個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端 來進行。你想要...
設計模式 初識
大致將設計模式看了一遍,雖說是第一遍看,但是好像也有些精讀的嫌疑,沒有掌握快速閱讀的精髓,但這個不是重點。大話模式 首先想到的是 大話西遊 確實這本書有些這樣的傾向,就像書中敘述的,這不是一本程式集,這不是一本故事集,這是一本通過故事講述查詢如何設計的方法集。故事都太經典了,以至於看完書之後,問模式...
設計模式 初識
從何而來?說到模式,我就有一種專業自豪感了。因為學的專業是工程管理,和建築方面打交道比較多,以至於每次有人問我學的什麼專業,我都會開玩笑的說,其實就是搬磚的。那麼為什麼說到模式,我就有一種專業自豪感呢?因為模式的思想就是基於建築的思想而產生的。在建築過程中,慢慢發現人們對於舒適住宅和城市環境存在一些...