前言
- 先說下一下為什么決定來寫關(guān)于設(shè)計(jì)模式的文章柔滔,本人也是從事開發(fā)很多年了共螺,很多人肯定都曾有過這樣的想法橱鹏,就是把設(shè)計(jì)模式背下來漏峰,到時(shí)候項(xiàng)目用到的時(shí)候就套用下糠悼,往往用到的時(shí)候早就忘了怎么寫了,或許只是簡單記住幾個寫法浅乔,現(xiàn)在看來這并不是真正的理解倔喂,套用不等于理解,真正理解之后會在思維里面形成一種模型靖苇,在做架構(gòu)設(shè)計(jì)席噩、封裝代碼時(shí)候會自然的把場景帶入,去理解每一種模式的場景顾复、優(yōu)點(diǎn)班挖、缺點(diǎn),才能更好的運(yùn)用芯砸。
- 設(shè)計(jì)模式是一套被反復(fù)使用萧芙、多數(shù)人知曉的、經(jīng)過分類編目的假丧、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)双揪。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解包帚、保證代碼可靠性渔期。
1.單一職責(zé)原則(SRP)
簡單的說就是:一個類中應(yīng)該是一組相關(guān)性很高的函數(shù)、數(shù)據(jù)的封裝。兩個不一樣的功能不應(yīng)該放在一個類中疯趟。
這個原則沒有具體的劃分界限拘哨,需要根據(jù)個人經(jīng)驗(yàn),具體業(yè)務(wù)邏輯而定信峻。這也是優(yōu)化代碼的第一步倦青。試想一下,如果所有的功能寫在一個類里盹舞,那么這個類會越來越大产镐,越來越復(fù)雜,越不易修改維護(hù)踢步。那么根據(jù)功能癣亚,各自獨(dú)立拆分出來,豈不是邏輯會清晰些获印。
2.開閉原則(OCP)
定義:軟件中的對象(類述雾、模塊、函數(shù)等)應(yīng)該對于擴(kuò)展是開放的蓬豁,但是對于修改是封閉的绰咽。
當(dāng)軟件需要變化時(shí),我們應(yīng)該盡量通過擴(kuò)展的方式實(shí)現(xiàn)變化地粪,而不是通過修改原有的代碼來實(shí)現(xiàn)取募。因?yàn)橹苯拥男薷模赡軙绊懸延械恼4a蟆技。不利于出現(xiàn)錯誤時(shí)排除問題玩敏。當(dāng)然實(shí)際開發(fā)中,修改原有代碼與擴(kuò)展代碼是同時(shí)存在的质礼。但應(yīng)盡量以擴(kuò)展為主旺聚。
3.里氏替換原則(LSP)
定義:所有引用父類的地方,必須能使用子類的對象眶蕉。簡單地說就是將父類替換為他的子類是不會出現(xiàn)問題砰粹,反之,未必可以造挽。
那么里氏替換原則就是依賴于面向?qū)ο笳Z言的繼承與多態(tài)碱璃。核心原理是抽象。這里列舉一下繼承的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
(1)代碼重用饭入,減少創(chuàng)建類的成本嵌器,每個子類都擁有父類的方法與屬性。
(2)子類與父類基本相似谐丢,但與父類又有所區(qū)別爽航。
(3)提高代碼的可擴(kuò)展性蚓让。
缺點(diǎn):
(1)繼承是侵入性的,只要繼承就必須擁有父類所有的屬性與方法讥珍。
(2)可能造成子類代碼冗余历极、靈活性降低。開閉原則和里氏替換原則是生死相依的串述、不離不棄的执解。他們都強(qiáng)調(diào)了抽象這一重要的特性寞肖。
4.依賴倒置原則(DIP)
定義:指代一種特定的解耦方式纲酗,使得高層次的模塊不依賴于低層次的模塊的實(shí)現(xiàn)細(xì)節(jié)的目的。他有一下幾個關(guān)鍵點(diǎn):
(1)高層模塊不依賴于低層模塊新蟆,應(yīng)該都依賴其抽象觅赊。
(2)抽象不依賴細(xì)節(jié)。
(3)細(xì)節(jié)應(yīng)依賴抽象琼稻。解釋:在Java中吮螺,抽象就是指接口或者抽象類,兩者都是不能直接被實(shí)例化的帕翻;細(xì)節(jié)就是實(shí)現(xiàn)類鸠补,實(shí)現(xiàn)接口或者繼承抽象類而產(chǎn)生的就是細(xì)節(jié),也就是可以加上一個關(guān)鍵字new產(chǎn)生的對象嘀掸。高層模塊就是調(diào)用端紫岩,底層模塊就是具體實(shí)現(xiàn)類。
依賴倒置原則在Java中的表現(xiàn)就是:模塊間通過抽象發(fā)生睬塌,實(shí)現(xiàn)類之間不發(fā)生直接依賴關(guān)系泉蝌,其依賴關(guān)系是通過接口或者抽象類產(chǎn)生的。如果類與類直接依賴細(xì)節(jié)揩晴,那么就會直接耦合勋陪,那么當(dāng)修改時(shí),就會同時(shí)修改依賴者代碼硫兰,這樣限制了可擴(kuò)展性诅愚。
5.接口隔離原則(ISP)
定義:類間的依賴關(guān)系應(yīng)該建立在最小的接口上,將龐大劫映、臃腫的接口拆分成更小的违孝、更具體的接口。目的是系統(tǒng)的解耦苏研,從而更容易重構(gòu)等浊、更改和重新部署。
6.迪米特原則(LOD)
定義:一個類應(yīng)該對自己需要耦合或者調(diào)用的類知道的最少摹蘑,類的內(nèi)部如何實(shí)現(xiàn)與調(diào)用者或者依賴者沒有關(guān)系筹燕,調(diào)用者或依賴者只需知道他需要的方法,其他可以一概不管。這樣使得系統(tǒng)具有更低的耦合與更好的可擴(kuò)展性撒踪。
這六個原則过咬,可以使我們在應(yīng)用的后續(xù)升級、維護(hù)中更加方便制妄、輕松應(yīng)對掸绞。讓我們的軟件更加靈活。
總結(jié)
在我看來設(shè)計(jì)模式就像軍人手中的武器耕捞,只有足夠鋒利才能所向披靡衔掸,光看書看文章是不夠的,要自己在項(xiàng)目里真正的場景去使用才能更好的理解俺抽,包括在工程師成長的道路中敞映,無論作為高級開發(fā)還是架構(gòu)師都是需要對這些要理解銘記于心,才能寫出更好用的代碼磷斧,更穩(wěn)定擴(kuò)展性更強(qiáng)的架構(gòu)振愿,才能做到心中有劍,落葉飛花皆是兵器的境界弛饭。