最近一段時間一直在看head first 設計模式,感觸頗深,遂把其中之心得記錄之,以便遺忘時重新熟悉。
6種設計原則
1.分離不變與可變:將可變元素提出,作為單獨的模塊,通過組合調用,不變的模塊作為類。
2.多用組合,少用繼承
3.面向接口編程,不要面向實現編程
4.為了交互對象之間的耦合設計而努力
設計模式
分為創建性模式、指責型模式、行為型模式(本人所寫設計模式完全根據書籍順序)
1.策略模式(行為型模式):
題目描述:為每種鴨子設置動作,fly、swim、quick、display四個方法。我們首先想到的編程方法為兩個鴨子(紅頭鴨、綠頭鴨)繼承自Duck抽象類,如下:
需求改變了,要使紅頭鴨會飛,綠不會飛,想到可以覆蓋duck中的fly方法,一個會飛,一個什么都不做。
現在需求又變了,來了一百只鴨子,五十只會飛,其他不會飛。怎么辦? 每個都覆蓋?
現在需求又變了,鴨子會了新的動作,會跳舞(dancing),怎么辦?duck加,所有子類覆蓋?
顯然是不現實的,軟件的復用(關閉修改、打開擴展)顯得尤為重要。
既然鴨子的動作會變(不同的叫聲、不同的飛行方式、不同的跳舞方式),而有些不會變(swim與display),由此我們可以分離不變與可變。將fly,quick提取,同時子類功能實現父類接口(面向接口編程),由此我們可以通過多用組合,少用繼承(duck與fly、quick用組合)增加程序的伸縮性,并通過在抽象類中定義引用,然后通過set方法注入來完成組合。
最后:注意一點,盡量不要在結構中出現new,用構造方法傳參或者set注入在client中生成對象后注入,這樣可以增加程序的靈活性,同時可以動態修改。
2. 觀察者模式
觀察者模式實質上就是在主題中加入list,將觀察者封裝。(加入get的作用是觀察者可自行取舍)。同時也可以看出:動態加入的只是接口引用,而非具體實現,所以改變一方,另一方不會受影響(為了交互對象之間的耦合設計而努力)
3. 裝飾者模式