一、前言
設(shè)計(jì)模式關(guān)乎了代碼的可擴(kuò)展性和可維護(hù)性,在開發(fā)過程中具有重要的江湖地位憎亚。此次僅討論關(guān)于七大原則(有的地方是六大原則,稍后說區(qū)別)的問題弄慰。
二第美、七大原則的基本概念
設(shè)計(jì)模式有七大原則,分別是:①單一職責(zé)原則曹动,②里氏替換原則斋日,③合成/聚合復(fù)用原則,④依賴倒轉(zhuǎn)原則墓陈,⑤接口隔離原則恶守,⑥最少知識(shí)原則,⑦開閉原則贡必。有的地方把組合/聚合復(fù)用去掉稱作六大原則兔港,個(gè)人認(rèn)為組合/聚合復(fù)用對(duì)于一個(gè)類的構(gòu)建還是很重要的,應(yīng)該加上仔拟。
三衫樊、七大原則的理解
1、單一職責(zé)原則
概念:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因科侈,即一個(gè)類只負(fù)責(zé)一項(xiàng)功能载佳。
我認(rèn)為不僅僅對(duì)于類,同樣對(duì)于方法或者模塊臀栈,也應(yīng)當(dāng)遵守單一職責(zé)原則蔫慧,即一個(gè)方法負(fù)責(zé)一個(gè)功能。
例如一個(gè)類中有制作餃子的方法权薯,該方法應(yīng)該只負(fù)責(zé)組合買韭菜姑躲、搟皮、包餃子等多個(gè)方法盟蚣,而不是直接在制作餃子的方法中寫具體步驟黍析,這樣有利于改變其中某個(gè)步驟時(shí)不影響其他步驟。同樣一個(gè)類也只負(fù)責(zé)一項(xiàng)功能屎开,則制作餃子類應(yīng)當(dāng)只負(fù)責(zé)組合步驟阐枣,具體每個(gè)步驟應(yīng)當(dāng)是獨(dú)立單一職責(zé)的類。步驟類可以通過new或者組合(不推薦使用new牍戚,之后的組合/聚合復(fù)用原則會(huì)講為什么)的方式加入制作餃子類侮繁。
2、里氏替換原則
概念:子類型必須能夠替換掉它們的父類型如孝。
遵守該原則的方法是在繼承類時(shí)宪哩,除了擴(kuò)展一些新的功能之外,盡量不要?jiǎng)h除或者修改對(duì)父類方法的引用第晰,也盡量不要重載父類的方法锁孟。
如果違反該原則,會(huì)大量重寫父類中的方法茁瘦,降低代碼復(fù)用性品抽,反映出了父類構(gòu)建的不完善,將子類的特有方法寫在了父類中甜熔。
3圆恤、合成/聚合復(fù)用原則
概念:盡量使用合成/聚合,盡量不要使用類繼承。
合成和聚合是通過將需要使用的方法形成新的對(duì)象腔稀,將對(duì)象通過set方法注入類的屬性盆昙,來達(dá)到類調(diào)用需要使用的方法。
通過合成焊虏,可以靈活的改變類需要的方法(此時(shí)屬性聲明為包含所需方法的接口類淡喜,后面依賴倒轉(zhuǎn)會(huì)討論),實(shí)現(xiàn)較少的修改類诵闭,而對(duì)類進(jìn)行擴(kuò)展炼团。
4澎嚣、依賴倒轉(zhuǎn)原則
概念:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象瘟芝;抽象不應(yīng)該依賴細(xì)節(jié)易桃,細(xì)節(jié)應(yīng)該依賴抽象。
依賴一般是指將對(duì)象傳遞給方法模狭。此處理解為將對(duì)象傳遞給屬性也應(yīng)當(dāng)稱之為依賴颈抚。即在一個(gè)類中使用其他的類,不應(yīng)當(dāng)直接使用其他類的實(shí)例化對(duì)象嚼鹉,應(yīng)當(dāng)使用其他類的抽象,然后通過注入或者傳遞的方式來使用具體實(shí)例化類驱富。
通過該原則锚赤,可以實(shí)現(xiàn)較少的修改類,而是通過不同的注入實(shí)現(xiàn)不同的功能褐鸥。該處使用了抽象的概念线脚,記得我一開始對(duì)接口有什么作用很不理解,在學(xué)習(xí)這個(gè)地方是對(duì)接口的作用有了深刻的理解叫榕。
5浑侥、接口隔離原則
概念:客戶端不應(yīng)該依賴它不需要的接口;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上晰绎。
當(dāng)一個(gè)類(a)對(duì)另一個(gè)類(b)依賴時(shí)寓落,如果不遵循該原則,則引入的對(duì)象不僅需要實(shí)現(xiàn)類a需要的方法荞下,同樣需要實(shí)現(xiàn)類a不需要的方法伶选,此時(shí)增加了代碼冗余,需要對(duì)以來的接口進(jìn)行分割尖昏,將需要的方法和不需要的方法分成兩個(gè)新的接口仰税,實(shí)現(xiàn)接口隔離。
6抽诉、最少知識(shí)原則
概念:?如果兩個(gè)類不必彼此直接通信陨簇,那么這兩個(gè)類就不應(yīng)當(dāng)直接的相互作用;如果其中一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話迹淌,可以通過第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用河绽。
該處主要思想是盡量減少類與類之間的調(diào)用,包括方法的調(diào)用和屬性的調(diào)用巍沙。例如兩家店葵姥,餐飲店和奶茶店,當(dāng)顧客需要兩家的菜單時(shí)句携,應(yīng)該兩家自己提供自己的菜單榔幸,而不是奶茶店將菜單給餐飲店(餐飲店調(diào)用奶茶店的菜單),然后餐飲店一起給顧客。這里分別提供削咆,因?yàn)閺目陀^上餐飲店和奶茶店并沒有聯(lián)系牍疏,但是顧客需要菜單,因此顧客可以調(diào)用兩家的菜單拨齐。
遵守該原則鳞陨,可以較少兩個(gè)類的耦合性,修改其中一個(gè)類不會(huì)影響另一個(gè)類瞻惋。
7厦滤、開閉原則
概念:類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放歼狼,對(duì)修改關(guān)閉掏导。
該原則貫穿以上六個(gè)原則,以上六個(gè)原則的最終目的就是實(shí)現(xiàn)開閉原則羽峰。實(shí)現(xiàn)了開閉原則趟咆,則對(duì)于代碼維護(hù)和擴(kuò)展具有很大的好處。
四梅屉、結(jié)尾
如果在編程中可以遵守七大原則值纱,則程序的可維護(hù)性和可擴(kuò)展性可以大大提高。同時(shí)坯汤,設(shè)計(jì)模式還有23種經(jīng)典模式虐唠,經(jīng)典的模式是實(shí)現(xiàn)七大原則的經(jīng)典方法,是前人經(jīng)驗(yàn)的總結(jié)和智慧的結(jié)晶玫霎,如果可以好好禮用凿滤,可以進(jìn)一步提高程序的可維護(hù)性和可擴(kuò)展性。
我覺得一開始可以只接觸遵守七大原則庶近,不需要盲目追求23種設(shè)計(jì)模式翁脆,當(dāng)對(duì)于七大原則有較好的理解并使用時(shí),可以再進(jìn)一步學(xué)習(xí)經(jīng)典的設(shè)計(jì)模式。