設(shè)計(jì)模式第一篇-設(shè)計(jì)模式概述

設(shè)計(jì)模式作為保證代碼擴(kuò)展性,易讀性工具之一,也是面試必備考點(diǎn)之一,是需要程序員必須熟練掌握的技能之一,所以自己再讀《設(shè)計(jì)模式之禪》,為提高學(xué)習(xí)質(zhì)量遂寫下數(shù)篇筆記,此篇為第一篇,主要講為什么要用設(shè)計(jì)模式,以及設(shè)計(jì)模式的原則和分類,這篇文章僅僅是提及各種設(shè)計(jì)模式的基本概念,后續(xù)會陸續(xù)更新每一種設(shè)計(jì)模式的具體含義,應(yīng)用場景及代碼實(shí)現(xiàn)

一. 為什么要用設(shè)計(jì)模式?

  • 設(shè)計(jì)模式是前人總結(jié)的經(jīng)驗(yàn)
  • 設(shè)計(jì)模式可以提高代碼的可重用性
  • 設(shè)計(jì)模式可以增強(qiáng)系統(tǒng)的可維護(hù)性
  • 設(shè)計(jì)模式可以增強(qiáng)代碼的可擴(kuò)展性
  • 設(shè)計(jì)模式可以提高系統(tǒng)的可閱讀性
    如果不僅僅想一直再一線碼代碼,有一個架構(gòu)師的理想,想要站在更高層面看待軟件開發(fā),設(shè)計(jì)模式便是你必須要掌握的技能之一

二. 設(shè)計(jì)模式的6大設(shè)計(jì)原則

1 單一職責(zé)原則

有且僅有一個原因?qū)е骂惖臓顟B(tài)的變更,接口盡量做到單一職責(zé),類的設(shè)計(jì)狀態(tài)改變盡量只有一個原因

2 里氏替換原則

所有引用基類的地方必須能夠透明的使用其子類的對象;只要父類出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類不會產(chǎn)生任何錯誤或者異常,使用者根本不需要知道到底是子類還是父類。但是反過來就不行了,有子類出現(xiàn)的地方,父類未必就能適應(yīng)

  • A:子類必須完全實(shí)現(xiàn)父類的方法
  • B:子類可以由自己“個性”
  • C:覆蓋或者實(shí)現(xiàn)父類的方法時輸入?yún)?shù)可以被放大
  • D:覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小

3 依賴倒置原則

面向接口編程,應(yīng)用到Java領(lǐng)域具體細(xì)則如下:

  • A:模塊間的依賴通過抽象發(fā)生,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系
  • B:接口和抽象類不依賴于實(shí)現(xiàn)類
  • C:實(shí)現(xiàn)類依賴接口或抽象類
    具體到項(xiàng)目中實(shí)施中應(yīng)該遵循以下幾個原則
  • A:每一個類盡量都有接口和抽象類,或者接口和抽象類都有
  • B:變量的表面類型盡量是接口或者抽象類。
  • C:任何類都不應(yīng)該從具體類派生
  • D:盡量不要覆寫基類的方法
  • E:結(jié)合里氏替換原則原則使用

4 接口隔離原則

客戶端不應(yīng)該依賴它不需要的接口;
具體的實(shí)施原則如下:

  • A:接口盡量小
  • B:接口要高內(nèi)聚
    盡量少公布public方法,接口是對外的承諾,承諾越少系統(tǒng)的開發(fā)月有利
  • C:定制服務(wù)
  • D:有限度的設(shè)計(jì)接口
    具體到項(xiàng)目應(yīng)用中實(shí)施的原則:
  • A:一個接口只服務(wù)一個子模塊或業(yè)務(wù)邏輯
  • B:通過業(yè)務(wù)邏輯壓縮接口中的public方法
  • C:已經(jīng)污染的接口,盡量去修改,若變更的風(fēng)險(xiǎn)較大,則采用適配模式進(jìn)行轉(zhuǎn)化處理
  • D:了解環(huán)境,拒絕盲從

5 迪米特原則

一個對象應(yīng)該對其他對象有較少的了解,即類間解耦
具體的原則

  • A:只和朋友交流
    類與類之間的關(guān)系建立在類間的,而不是方法間的,因此一個方法盡量不引入一個類中不存在的對象。
  • B:朋友之間也是有距離的
    盡量不要對外公布太多public方法或者非靜態(tài)的public變量,盡量內(nèi)斂,多使用private,package-private,protected等訪問權(quán)限
  • C:是自己的就是自己的
    如果一個方法放在本類中,既不增加類間關(guān)系,也對本類不產(chǎn)生負(fù)面影響,那就放置到本類中。
  • D:謹(jǐn)慎使用Serializable

6 開閉原則

一個軟件實(shí)體如類,模塊,函數(shù),應(yīng)該對擴(kuò)展開放,對修改關(guān)閉
為什么要堅(jiān)持開閉原則?

  • A:開閉原則對測試的影響
    • 擴(kuò)展修改可以減少測試工作量
  • B:開閉原則可以提高程序的可復(fù)用性
  • C:開閉原則可以提高程序的可維護(hù)性
  • D:開閉原則是面向?qū)ο箝_發(fā)的要求
    項(xiàng)目中如何使用?
  • A:抽象約束
  • B:元數(shù)據(jù)控制模塊的行為
  • C:制定項(xiàng)目章程
    • 約定優(yōu)于配置
  • D:封裝變化
    • 將相同的變化封裝到同一個接口。

三. 設(shè)計(jì)模式的分類

經(jīng)常提及的設(shè)計(jì)有23種,這23中設(shè)計(jì)模式按照其特點(diǎn)可依此分為創(chuàng)建型,結(jié)構(gòu)型,行為型

3.1 創(chuàng)建型

創(chuàng)建型模式是用來創(chuàng)建對象的模式,抽象了實(shí)例化的過程,幫助一個系統(tǒng)獨(dú)立于其他關(guān)聯(lián)對象的創(chuàng)建、組合和表示方式。所有的創(chuàng)建型模式都有兩個主要功能:

  • 1.將系統(tǒng)所使用的具體類的信息封裝起來
  • 2.隱藏類的實(shí)例是如何被創(chuàng)建和組織的。外界對于這些對象只知道他們共同的接口,而不清楚其具體的實(shí)現(xiàn)細(xì)節(jié)。
1. 工廠模式

定義一個用戶創(chuàng)建對象的接口,讓子類決定具體實(shí)例化哪一個類。工廠方法使一個類的實(shí)例化延遲到其子類中。

2. 抽象工廠模式

為創(chuàng)建一組相關(guān)或者相互依賴的對象提供統(tǒng)一的接口,而且無需指定他們的具體類

3. 建造者模式

將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示

4. 原型模式

用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象

3.2 結(jié)構(gòu)型

結(jié)構(gòu)型模式討論的是類和對象的結(jié)構(gòu),它采用繼承機(jī)制來組合接口或?qū)崿F(xiàn)(類結(jié)構(gòu)型模式),或者通過組合一些對象實(shí)現(xiàn)新的功能(對象結(jié)構(gòu)型模式)。這些結(jié)構(gòu)型模式在某些方面具有很大的相似性,但側(cè)重點(diǎn)各有不同。

1. 代理模式(Proxy)

為某一個對象提供一種代理對象已達(dá)到控制其他對象對這個對象訪問的一種設(shè)計(jì)模式;代理分為:動態(tài)代理和靜態(tài)代理,其中動態(tài)代理應(yīng)用比較廣泛:AOP編程模式就是基于動態(tài)代理實(shí)現(xiàn)的

2. 裝飾模式

動態(tài)給對象增加一些額外的職責(zé),

3. 適配器模式

將一個類的接口變換成客戶端所期待的接口,從而使得原本接口不匹配不能在一起工作的兩個類可以在一起工作

4. 組合模式

也叫作合成模式,將對象組合成樹形結(jié)構(gòu)以表示成“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性

5. 橋梁模式

又稱橋接模式,將抽象和實(shí)現(xiàn)解耦,使得兩者可以獨(dú)立德變化

6. 外觀模式

又稱門面模式,要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進(jìn)行,外觀模式提供一個高層次的接口,使得子系統(tǒng)更加易于使用

7. 享元模式

對象池技術(shù)的重要實(shí)現(xiàn)方式,使用共享對象可有效的支持大量的細(xì)粒度的對象

3.3 行為型

行為型設(shè)計(jì)模式關(guān)注的是對象的行為即對象的方法,用來解決對象之間的依賴和聯(lián)系問題。

1. 模板方法模式

定義一個操作中算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟

2. 命令模式

將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數(shù)化;對請求排隊(duì)或者記錄請求日志,可以提供命令的撤銷和恢復(fù)功能

3. 責(zé)任鏈模式

使得多個對象都有機(jī)會處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止

4. 策略模式

定義一組算法,將每個算法都封裝起來,并且使得他們之間可以互換

5. 迭代器模式

它提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內(nèi)部細(xì)節(jié)

6. 中介者模式

用一個中介對象封裝一系列的對象交互,中介者使得個對象不需要顯示地相互作用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互

7. 觀察者模式

定義一個對象間一種一對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新

8. 備忘錄模式

在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài)并在該對象之外保存這個狀態(tài)。這樣以后就可將對象恢復(fù)到原先保存的狀態(tài)

9. 訪問者模式

封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作。

10. 狀態(tài)模式

當(dāng)一個對象的內(nèi)部狀態(tài)改變時允許其改變行為,這個對象看起來像改變了其類;

11. 解釋器模式

給定一門語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子

參考文獻(xiàn)

《設(shè)計(jì)模式之禪》
設(shè)計(jì)模式-概念、要素、分類(00)
設(shè)計(jì)模式分類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容