剛考完Java設計模式,趁熱打鐵留下篇博客方便以後查閱和理解。
課程書籍是《Java設計模式》,劉偉編著。
面向對象設計原則
面向對象設計原則爲支持可維護性複用而誕生,這些原則蘊含在很多設計模式中,它們是從許多設計方案中總結出的指導性原則,但並不是強制性的。
最常見的7個面向對象設計原則:
設計原則名稱 | 定義 | 理解或實踐 |
---|---|---|
單一職責原則 | 一個對象應該只包含單一的職責,並且該職責被完整地封裝在一個類中。 | 單一職責原則是實現高內聚,低耦合的指導方針。 |
開閉原則 | 軟件實體應當對擴展開放,對修改關閉。 | 抽象化是開閉原則的關鍵。 |
裏式代換原則 | 所有引用基類的地方必須能透明地使用其子類的對象。 | 在程序中儘量使用基類類型來定義對象。 |
依賴倒轉原則 | 高層模塊不應該依賴底層模塊,它們都應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象 | 針對接口編程,不要針對實現編程。有依賴必有抽象(接口)說法的來源。 |
接口隔離原則 | 客戶端不應該依賴那些它不需要的接口。 | 提供儘可能小的單獨的接口,而不要提供大的總接口。 |
合成複用原則 | 優先使用對象組合,而不是通過繼承來達到複用的目的。 | 成員對象方式(黑箱複用)相對於繼承(白箱複用)而言,耦合度更低。一個“has-A”,一個“is-A” |
迪米特法則 | 每一個軟件單位對其他單位都只有最少的知識,而且侷限於那些與本單位密切相關的軟件單位。 | 一個軟件實體應該儘可能少的與其他實體發生相互作用。 |
在軟件開發中使用面向對象設計原則可以提高軟件的可維護性和可複用性,以便設計出兼具良好的維護性和可複用性的軟件系統,實現可維護性複用的目標。
設計模式分類
1.根據目的分類:
類型 | 模式 | 目的 |
---|---|---|
創建型 | 工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式 | 主要用於創建對象。 |
結構型 | 適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式、代理模式 | 主要用於處理類或對象的組合。 |
行爲型 | 職責鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態模式、策略模式、模板方法模式、訪問者模式 | 主要用於描述類或對象怎樣交互和怎樣分配職責。 |
2.根據範圍分類
類模式和對象模式
創建型設計模式
目的:用於創建對象
0.簡單(靜態)工廠模式(非23種設計模式中的一種):通常也就是一個Factory類,一個get對象的static方法。
1.工廠方法模式:比簡單工廠模式多了個抽象層,也就沒有了static修飾get對象的方法。
2.抽象工廠模式:角色和結構都和工廠方法模式類似。
工廠方法模式和抽象工廠模式的區別:
工廠方法模式: 只有一個抽象產品類,具體工廠類只能創建一個具體產品類的實例
抽象工廠模式: 有多個抽象產品類 ,具體工廠類能創建多個具體產品類的實例
3.建造者模式
- 目的:創建複雜對象。
- 角色:抽象建造者、具體建造者、產品、指揮者
- 邏輯:指揮者指揮建造者(指揮者對象維護了建造者對象),建造者確定怎樣建造產品(建造者對象維護了產品對象)。最終客戶端通過指揮者對象傳入的具體建造者對象來獲取產品對象。
- 好處:屏蔽和分離了複雜對象的具體構建過程(封裝在具體建造者中)。
4.原型模式
- 目的:創建類似對象
- 淺克隆:對象內的引用類型成員不會克隆。Java的Cloneable接口和clone方法
- 深克隆:對象內的引用類型成員也會克隆。Java的Serializable接口+序列化技術
5.單例模式
- 目的:創建唯一性的對象
- 步驟:私有化成員變量、私有化構造函數、提供公有方法獲取對象
- 餓漢單例模式:不能實現延遲加載,始終佔用內存
- 懶漢單例模式:延遲加載,但安全控制繁瑣(代碼塊鎖+雙重判斷處理線程安全問題),性能受影響。
- 靜態內部類方式:延遲加載、線程安全、不影響系統性能。
結構型設計模式
目的:處理類或對象之間的組合。
1.適配器模式
- 類比生活:適配器對象指電腦,適配者對象就是各種外設
- A:適配器對象
- B:適配者對象
- 使用邏輯:以適配器爲核心,指定適配者,面向適配器對象操作即可。(適配器內部轉發調用適配者的方法)
2.橋接模式
- 類比生活:擴充對象是指各種筆,實現對象就是指各種紙
- A:實現對象(紙對象)
- B:擴展對象(筆對象)
- 使用邏輯:同適配器模式。不一樣的是,這裏B對象的引用使用基類類型來定義對象,可接受不同的實現類,實現定製效果。
其實對比適配器模式不難發現,如果適配者對象也是有抽象層並使用基類類型對象定義,那麼和橋接模式的表現基本一致了。
3.組合模式(部分-整體模式)
- 類比生活:葉子構件指文件,容器構件就是文件夾。
- C:最外層容器
- A1、A2、A3:都是最外層容器內的葉子或容器組件
- 使用邏輯:以容器對象爲核心,面向容器操作,添加刪除獲取元素對象以及容器的整體行爲。
- 使用場景:組合模式有容器概念,側重容器的整體行爲或者對容器內元素的統一處理
4.外觀模式
- C:外觀角色
- A、B、C:子系統角色
- 使用邏輯:以外觀對象爲核心,外觀對象的方法內部轉發調用了各子系統角色方法。
5.享元模式
- 概念:運用共享技術有效地支持大量細粒度對象的複用。
- C:享元工廠
- a、b、c:不同享元類的對象
與組合模式的比較:
組合模式關注容器,凸顯容器和元素的整體行爲,內部元素對象的類通常有共性抽取出抽象層,所以圖示裏使用A1、A2等表示。
享元模式關注元素,側重元素對象的共享,元素對象的獲取,所以圖示使用小寫的abc表示。
6.裝飾者模式
- A:指被裝飾的對象
- D1、D2、D3:都指裝飾類對象
- 使用邏輯:關注核心始終都是被裝飾對象A,外部裝飾對象只是對內部裝飾對象或原對象A已有的成員變量和方法做邊緣處理或者添加新的方法,是增強對象的一種方式。
7.代理模式
- 種類:靜態代理、遠程代理、虛擬代理、動態代理
- P:代理對象
- A:被代理對象
- u1、u2都是代理對象用到的工具對象,如身份驗證對象、日誌記錄對象。
- 使用邏輯:代理對象使用工具對象對被代理對象已有的成員變量和方法做邊緣處理或者添加新的方法,是增強對象的一種方式。
行爲型設計模式
目的:描述類或對象怎樣交互和怎樣分配職責。
此類模式都應使用類的結構圖來描繪,方便理解,這裏先偷個懶留個坑,待更新。
1.職責鏈模式
- A0:抽象處理者
- An(n=1,2,3,4,…):具體處理者
- 關鍵部分:setSuccesstor(指定當前職責對象的下一職責對象)、handleRequest(當前職責業務代碼,以及判斷是否跳轉到下一職責對象)
結構圖:
待更新
2.命令模式
待更新
3.解釋器模式
4.迭代器模式
5.中介者模式
6.備忘錄模式
7.觀察者模式
8.狀態模式
9.策略模式
10.模板方法模式
11.訪問者模式
博主此時大三,水平有限,如有錯誤,盡請指正。