目錄
閒談設計模式 - 七大原則
懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要.
一、設計模式的目的
編寫軟件的過程,面臨 == 耦合性、內聚性、維護性、可擴展性、重用性、靈活性== 等各方面的挑戰。
設計模式就是爲了解決這些問題
- 代碼重用性:相同功能代碼,不寫多次
- 可讀性:編程規範性,利於閱讀和理解
- 可擴展性:增加新的功能非常方便
- 可靠性:當增加新的功能後對原來功能沒有影響
二、設計模式七大原則
編程時遵循的原則,各種設計模式的基礎
1. 單一職責原則
-
基本介紹
對類來說,一個類只負責一項職責,如果 A 負責兩個不同職責:職責1,職責2.
當職責1 需求變更的時候改變 A,可能會造成 職責2 執行錯誤,職責2 同理。
所以需要將 類A 的粒度分解成 A1 , A2
-
注意事項和細節
- 降低類的複雜度,一個類只負責一項職責
- 提高類的可讀性,可維護性
- 降低變更引起的風險
2.接口隔離原則
-
基本介紹
客戶端不應該依賴它不需要的接口,也就是說 一個類的依賴應該建立在最小的接口上
-
處理方法
將一個接口拆分成幾個獨立的接口,當類需要的時候多實現就可以
3.依賴倒轉原則(Dependence Inversion Principle)
- 基本介紹
- 高層模塊不應該依賴底層模塊,二者都應該是依賴抽象
- 抽象不應該依賴細節,細節應該依賴抽象
- 依賴倒轉(倒置)的中心思想是面向接口編程
- 依賴倒轉原則是基於這樣的設計理念:相對於細節的多邊形,抽象的東西要穩定的多。以抽象爲基礎搭建的架構比細節爲基礎的架構穩定的多。在Java中,抽象指的是接口或抽象類,細節是具體的實現類
- 使用接口或抽象類的目的是 指定好規範,而不涉及任何具體的操作,把展現細節的任務交給實現類
- 注意事項和細節
- 低層模塊儘量都有抽象類和接口,或者兩者都有程序穩定性更好。
- 變量的聲明類型儘量是抽象類或者接口,這樣在變量的引用和 實際對象間存在緩衝層,利於程序拓展和優化
- 繼承時遵循里氏替換原則
4.里氏替換原則
-
前言思考
- 繼承包含這層含義:父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞
- 繼承在給程序設計帶來便利的同時,也帶來了弊端,比如使用繼承會給程序帶來侵入性,程序的可移植性降低,增加對象間的耦合性,如果一個類被其他的類所繼承,則這個需要修改時,必須考慮到所有子類,並且父類修改後,所有涉及的子類的功能都有可能產生故障
那麼問題來了,如何正確使用繼承?
答案:里氏替換原則
-
基本介紹
-
如果對每個類型 爲 T1 的對象 o1,都有類型爲 T2 的對象 o2,使得以 T1定義的所有程序 P 在所有的對象o1都代替成 o2時,程序P的行爲沒有發生變化,那麼類型T2是類型T1的子類型。也就是,所有引用父類的地方必須能透明地使用其子類對象
-
在使用繼承時 ,遵循里氏替換原則,在子類中儘量不要重寫父類的方法
-
繼承實際上讓兩個類耦合性增強了,在適當情況下,可以通過聚合、組合、依賴 來解決問題
-
-
解決方法
類B 繼承 類A 並重寫父類方法,造成原有功能錯誤
實際編程中,常常會重寫父類的方法完成新功能,這樣寫起來雖然簡單,但是整個繼承體系的複用性比較差,特別是運行多態比較頻繁的時候
解決方法
原來的父類和子類都繼承一個更通俗(抽象)的基類,原有的繼承關係去掉,採用依賴、聚合、組合等關係代替
5.開閉原則
-
基本介紹
-
開閉原則(Open Closed Principle)是編程中最基礎、最重要的設計原則
-
一個軟件實體 如 類、模塊、函數 應該對外開放,對修改關閉。用抽象構建框架,用實現擴展細節
-
當軟件需要變化時,儘量通過擴展軟件實體的行爲來實現變化,而不是通過修改已有的代碼來實現變化
-
編程中遵循其他原則,以及使用設計模式的目的就是遵循開閉原則
-
6.迪米特法則(降低類之間的耦合度)
-
基本介紹
-
一個對象應該對其他對象保持最少的瞭解
-
類與類關係越密切,耦合度越大
-
迪米特法則(Demeter Principle - 最少知道法則):一個類對自己依賴的類知道的越少越好。也就是,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供的 public 方法,不對外泄露任何信息
-
更簡單的定義:只與直接的朋友通信
直接的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象之間有耦合關係,就說這兩個對象之間是
朋友關係
。耦合的方式很多,依賴、關聯、組合、聚合 等。其中,我們稱出現成員變量,方法參數,方法返回值
中的類爲直接的朋友
,而出現在局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量的形式出現在類的內部。
-
-
注意事項和細節
- 迪米特法則的核心是降低類之間的耦合度
- 由於每個類都減少不了不必要的依賴,因此迪米特法則
只是要求降低
類之間的耦合關係,並不是要求完全沒有依賴關係
7.合成複用原則(Composite Reuse Principle)
-
基本介紹
原則是儘量使用合成/聚合的方式,而不是繼承