- 儘量使用“組合”而少用“繼承”
- 面向“接口”編程,而非面向“實現”
- 對象間的交互行爲要儘可能“鬆耦合”設計
- 類要對“擴展”開放,對“修改”關閉
- 依賴“抽象”而不依賴具的類
- 只和朋友交談(不要通過A類去獲取B類並訪問它)
- 等我的電話,別打給我
- 一個類只應該有一個改變的理由(一個類只應給關注一個功能面)
策略模式
- 定義了一系列的算法,分別分裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
- 封裝可以互換的行爲,並使用委託來決定要使用哪一個。
- 配合Spring 的IOC配置,真是相得益彰啊
觀察者模式
- 定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。
- 讓對象能夠在狀態改變時被通知。
- 典型的例子如,swing中的listener設計
- 其實,被觀察者也可以是一系列的類,有自己的接口
裝飾着模式
- 動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案
- 裝修器通常實現一個接口,並同時持有實現這個接口的另一個實現類的實例。
- 封裝一個對象,以提供新的行爲。
- 非常熟悉的例子就是Java 的IO包中的InputStream和OuputStream
工廠模式
- 定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
- 由子類決定要創建的具體類是哪一個。
- 最常見的就是common logging中的LogFactory了
抽象工廠模式
- 提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。
- 允許客戶創建對象的家族,而無需指定它們的具體類。
單例模式
- 確保一個類只有一個實例,並提供一個全局訪問點。
- 確保有且只有一個對象被創建
- 貌似誰都會寫的模式,也最容易理解,其實不然,注意單例在多線程環境下的使用
命令模式
- 將請求封裝成一個對象(通常會帶上請求的執行者一併封裝),以便使用不同的請求、隊列或者日誌來參數化其他對象。
- 傳說是可以執行UNDO的操作。
- 有了它還可以實現任務調度哦(優先級、定時執行)。
適配器模式
- 將一個類的接口、轉換成客戶期望的另一個接口。
- Java只支持對象適配,不支持類適配,因爲沒有多重繼承啊
- 看看swing中對listener接口的adapter實現的種種吧,感覺這個模式很好理解
外觀模式
- 也叫做“門面模式”,提供一個統一的接口,用來訪問子系統中的一羣接口。它提供了系統的一個高層接口,讓子系統更容易使用。
- 簡化一羣類的接口(將一系列的調用封裝成一個調用,有點像“宏”或者批處理的概念)
- 實際上就是OO設計中談到的“封裝”,這個模式實際上,我們經常會不自覺的使用上,最不用學習的一個模式。
模板模式
- 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
- 由子類決定如何實現一個算法中的步驟。
- 知道C/C++中的鉤子嘛,就是用這種模式實現的,很神奇的一個模式哦。加上用配置變量控制鉤子,真是變化無窮啊。威力強大!!!
- Java集合框架中的比較算法(equals,hashCode, compareTo)用得就是模板模式
迭代器模式
- 提供一種方法,順序訪問一個聚合中的各個元素,而不暴露集合的實現。
- java.util.Iterator聞名天下啊,沒啥好多說的了
組合模式
- 允許你將對象組合成樹型結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及對象組合。
- 窗體組件渲染基本都好似用這種模式。
- 組合模式是遞歸的一種結構化表示。
狀態模式
- 允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
- 封裝了基於狀態的行爲,並使用“委託對象”在行爲之間切換。
- 這是狀態機理論的OO化表現。
代理模式
- 爲另一個對象提供一個替身或佔位符以控制對對象的訪問。
- EJB ,RMI 的stub ,Hibernate中的延遲加載,Spring中的AOP,proxy在我們的周圍比比皆是啊,包裝對象,以控制對此對象的訪問是這個模式最吸引人的地方。
- 看過電影《機器化身》嘛,不理解這個模式的話,看過這部電影就知道了,哈哈。