面向對象設計的基礎準則

 對“多變”的部分進行封裝
  • 儘量使用“組合”而少用“繼承”
  • 面向“接口”編程,而非面向“實現”
  • 對象間的交互行爲要儘可能“鬆耦合”設計
  • 類要對“擴展”開放,對“修改”關閉
  • 依賴“抽象”而不依賴具的類
  • 只和朋友交談(不要通過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在我們的周圍比比皆是啊,包裝對象,以控制對此對象的訪問是這個模式最吸引人的地方。
  • 看過電影《機器化身》嘛,不理解這個模式的話,看過這部電影就知道了,哈哈。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章