《Head First》這本書是我覺得理解設計模式最棒的書本。至於其神奇之處,我想看過此書的人都會跟我一樣的感慨!
面向對象基礎
1、抽象
2、封裝
3、繼承
4、多態
設計原則
1、找出應用中可能需要變化的地方,把它獨立出來,不要和那些不需要變化的混淆在一起。把變化的部分“封裝”
2、針對接口編程,而不是實現編程。把行爲放在分開的類中,此類專門提供某行爲接口的實現
3、多用組合,少用繼承。“有一個”可能比“是一個”更好。例如接口變成具體行爲,變成某個對象的有一個行爲。
4、爲了交互對象之間松耦合設計而努力。這個也是要靠接口和委託爲入口,不然它們之間沒有“途徑”進行溝通。
5、類應該對擴展開放,對修改關閉。
6、要依賴抽象,不要依賴具體類。看看工廠方法,把創建方法抽象成接口,然後創建對象時候是調用統一工廠而不是具體類去new。
7、最少知識原則,只和你的密友談話。
8、好萊塢原則,別調用(打電話給)我,我會調用(打電話給)你。模板方法中高層組件和低層組件之間的解耦。
9、一個類應該只有一個引起變化的原因。儘量讓每個類保持一種責任。
策略模式
定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。
封裝可以互換的行爲,並用委託來決定使用哪一個。
觀察者模式
定義了對象之間的一對多關係,這樣,當一個對象改變狀態時候,它的所有監聽者便能收到通知並自動更新。
3個關鍵詞:registerObserver(),removeObserver(),notifyObservers()
目地:讓對象能在變化時候收到通知。
裝飾者模式
動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
通過繼承包裝一個對象,以擴展新的功能。
工廠模式
定義了一個創建對象的接口,但由具體子類決定要實例化的類是哪一個。讓類的實例化推遲到子類。
例如:紐約工廠、北京工廠,他們創造的方法接口一樣,但產品不一樣。就是將創建對象的代碼封裝起來。
抽象工廠模式
提供一個接口,用於創建相關或者依賴對象的家族,而不需要明確指定具體類。
工廠方法是創建一個對象的方法,那麼抽象工廠是把創建對象相關的流程組合起來抽象成一堆方法接口。允許客戶創建一個產品的家族,而無需知道具體類。
單件模式
確保一個類只有一個實例,並提供一個全局訪問點。
構造方法私有化,提供shareInstance方法訪問。
命令模式
將“請求”封裝成對象,以便使用不同的請求、隊列或者日誌來參數化其他對象。命令模式也支持可撤銷的操作。
也可以說把行爲變成具體對象,可以動態切換。類似策略模式。以及服務器處理“請求”,也就是請求對象放到隊列裏面。
適配器模式
將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
適配器對象裏面組合了另外的對象,但繼承了原本接口。原本接口調用其實就是調用組合的對象的實際方法。
外觀模式
提供了一個統一的接口,用來訪問子類系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用。
例如電視遙控打開電視機這個方法。
模板方法模式
在一個方法種定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
模板方法就是一個方法,只是把實現分成各個步驟,然後這些步驟是由子類方法去決定的。
模板方法通常有一個“鉤子”,可以讓子類去實現很多其他事情。讓算法留有餘地,能被更好利用和控制。
迭代器模式
提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部的組合方式。
例如Hashtable、ArrayList等組合都可以提供一個Iterator迭代器。
關鍵詞:Iterator\hasNext\next\remove
*空對象模式
空迭代器,當沒有任何可以遍歷時候,可以createIterator()返回空迭代器,這個迭代器的接口方法返回永遠是false,這樣不擔心改變這種模式的“空問題”。
組合模式
允許你將對象組合成樹形結構來表現“整體\部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及對象組合。
關鍵詞:addChild\remove\getChild
關聯:例如Unity3d中的Component,例如cocos2d中的Node節點
狀態模式
允許對象在內部狀態改變時候改變它的行爲,對象看起來好像修改了它的類。
這個模式將狀態封裝成獨立的類,接口爲State,並在運行過程中把動作委託給當前的狀態對象。
聯繫:AI行爲處理,狀態機之間的切換
代理模式
爲另一個對象提供一個替身或佔位符以控制對這個對象的訪問。
使用代理模式創建代表對象,讓代表對象控制某對象的訪問或者做額外的處理和包裝。被代理的對象可以是遠程的對象,創建開銷大的對象或者需要安全控制的對象。
複合模式
結合2個或者以上的模式,組合成一個解決方案。
關聯:典型的MVC,Model處理應用數據和數據邏輯,沒有視圖關係;View是負責顯示的組件,以及控制組件的方式,但不負責對組件做具體事情;Controller控制View的動作,以及通知Model做某些事情,就是View和Model的控制者。
最後附上模式的分類