設計模式相關項目舉例鏈接地址
7大設計原則
-
單一職責原則
- 降低類的復雜度,一個類只負責一項職責
- 提高可讀性可維護性
-
接口隔離原則
一個類對另一個類的依賴應該建立在最小的接口上
-
依賴倒轉原則
- 低層模塊盡量都要有抽象類或接口
- 變量的聲明類型盡量是抽象類或接口,以在變量引用和實際對象間存在一個緩沖層
- 繼承時遵循里氏替換原則
-
里氏替換原則
- 所有引用基類的地方必須能透明地使用其子類的對象
- 在子類中盡量不要重寫父類的方法
-
開閉原則
- 對擴展開放,對修改關閉。
-
迪米特法則
- 簡單定義:只與直接的朋友通信,最少知道原則。
- 核心是降低類之間的耦合
-
合成復用原則
- 盡量使用合成/聚合的方式,而不是使用繼承。
- 針對接口編程
類圖
- 依賴關系:
- 泛化關系:繼承
- 實現關系:
- 關聯關系:
- 聚合關系:
- 組合關系:整體和部分不可分開
設計模式
單例模式
- 保證了 系統內存中該類只存在一個對象,節省了系統資源。
- 對於一些需要頻繁創建銷毀的對象,使用單例模式可以提高系統性能。
- 當想實例化一個單例類的時候,必須要記住使用相應的獲取對象的方法,而不是使用new
使用場景:需要頻繁的進行創建和銷毀的對象、創建對象時耗時過多或耗費資源過多(即:重量級對象),但又經常用到的對象、工具類對象、頻繁訪問數據庫或文件的對象(比如數據源、session工廠等)
工廠模式
三種工廠模式 (簡單工廠模式、工廠方法模式、抽象工廠模式)
意義:將實例化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦。從而提高項目的擴展和維護性。
創建對象實例時,不要直接 new 類, 而是把這個new 類的動作放在一個工廠的方法中,並返回。
變量不要直接持有具體類的引用。 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(接口) 不要覆蓋基類中已經實現的方法。
- 簡單工廠,就是一個工廠里面可以加工一個類型的不同實例對象,比如可以加工好座椅,也可以加工壞座椅,但必須是座椅。
- 工廠方法的一個工廠只能加工一個類型的一個實例對象。比如,座椅,一個工廠只能加工一種質量的座椅出來。
- 抽象工廠比較適合一個產品簇。因為一個工廠可以加工多個不同類型的實例對象。比如【座椅,輪胎】,一個工廠不但可以加工出來座椅,還可以加工出來輪胎,但是座椅,和輪胎的種類只能是一種。
原型模式
- 創建新的對象比較復雜時,用來簡化對象的創建過程,同時也能夠提高效率
- 不用重新初始化對象,而是動態地獲得對象運行時的狀態
- 如果原始對象發生變化(增加或者減少屬性),其它克隆對象的也會發生相應的變化,無需修改代碼
- 在實現深克隆的時候可能需要比較復雜的代碼
- 缺點:需要為每一個類配備一個克隆方法,這對全新的類來說不是很難,但對已有的類進行改造時,需要修改其源代碼,違背了ocp原則。
適配器模式
三種命名方式,是根據 src是以怎樣的形式給到Adapter(在Adapter里的形式)來命名的。將原本不兼容的接口融合在一起工作。
-
類適配器:以類給到,在Adapter里,就是將src當做類,繼承
- Java是單繼承機制,所以類適配器需要繼承src類這一點算是一個缺點, 因為這要求dst必須是接口,有一定局限性;
- src類的方法在Adapter中都會暴露出來,也增加了使用的成本。
- 由於其繼承了src類,所以它可以根據需求重寫src類的方法,使得Adapter的靈活性增強了。
-
對象適配器:以對象給到,在Adapter里,將src作為一個對象持有。
- 根據合成復用原則,使用組合替代繼承。
- 解決了類適配器必須繼承src的局限性問題,也不再要求dst必須是接口 使用成本更低,更靈活。
-
接口適配器:以接口給到,在Adapter里,將src作為一個接口,實現
- 一些書籍稱為:適配器模式(Default Adapter Pattern)或缺省適配器模式。
- 當不需要全部實現接口提供的方法時,可先設計一個抽象類實現接口,並為該接口中每個方法提供一個默認實現(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現需求
- 適用於一個接口不想使用其所有的方法的情況。
代理模式
- 通過代理對象訪問目標對象。好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能。
- 被代理的對象可以是遠程對象、創建開銷大的對象或需要安全控制的對象
- 代理模式有不同的形式, 主要有三種 靜態代理、動態代理 (JDK代理、接口代理)和 Cglib代理(可以在內存動態的創建對象,而不需要實現接口, 他是屬於動態代理的范疇)。
觀察者模式
- 觀察者模式設計后,會以集合的方式來管理用戶(Observer),包括注冊,移除和通知。
- 這樣,我們增加觀察者(這里可以理解成一個新的公告板),就不需要去修改核心類WeatherData不會修改代碼,遵守了ocp原則。