設計模式之 六大原則

2021-07-03 22:34:24 字數 3255 閱讀 7980

設計模式中,有六大經典的原則,以下是本人在學習過程中總結的,學習過程中參考了《大話設計模式》這本書,以下為個人見解,如有不當,請大家指出。以便幫助後學習的朋友更簡單的理解和學習。

1、單一職責原則(single responsibility principle)

顧名思義,單一職責,就是讓系統中的每個類都有自己的事情,不要「亂摻和」,乙個類,只做一件事情,只讓乙個「事件」來驅動,例如:生產一台電風扇,電風扇有很多零件組成,扇葉,電動機,螺絲。。。等等,這個時候,如果乙個類承擔了所有的工作,既要生產電動機,又要做扇葉,麻煩不說,工作量和日後的維護都是個大問題,所以,就要把這些大的功能細化,分為小功能,制定好統一的標準後,讓每個類只做乙個功能,

例如,乙個電風扇需要電壓為220v的電動機,乙個類只負責生產電動機,其他的一律不管,別的零件「愛怎樣就怎樣」,我只負責生產,生產完之後,誰去用,怎麼用,都不是這個類考慮的問題,這樣,將問題細化,類的職責單一之後,日後維護起來就容易了許多。判斷乙個類是否是單一職責很簡單:如果你能想到多於乙個原因去改變這個類,那麼這個類就不是單一職責的

例如:上面寫的,生產電動機的類,表面上看,這個類中生產電動機,別的都不管,看上去好像的單一職責的,但是你寫完之後,再去想一下,有什麼變動會讓我去改動這個類,來適應這個變動呢?隨便想一下,假如我的額定電壓該成100v了,這個類是不是要改?假如我想讓這個電動機有檔位的功能,這個類是不是要改?假如我的電動機想變成大一號的,這個類是不是要改?等等。。。那麼,這個類的改動的原因,不止乙個,那這個類就不是單一職責的。所以,這個類的功能,還要再次細化,細化到只有乙個變動的原因才能驅使你改變這個類為止。上邊的電動機,分解為各個小的部件,例如乙個類專門生產電壓適應器,只有我改變電壓的時候,才需要對這個類做出改變,其他的,電動機增加檔位,改變電動機大小,都與這個類無關,那麼,這個類就是單一職責的。

2、開-閉原則(open close principle)

開閉原則,即對擴充套件開放,對修改關閉。這個原則大體的意思就是,當乙個系統完成時,面對新增的需求,要做的是在原有基礎上增加,而不是在原有基礎上修改

還是用上面的例子,假如我的電風扇生產好了,一開始用的挺好的,但是後來,我想在電風扇地下加幾個輪子,怎麼辦?難道我要把電風扇拆開,去買個帶輪子的底座,在重新安上麼?這未免太複雜了,而且萬一底座上有什麼電路的話,換起來就更麻煩了。最好的解決辦法是,買幾個輪子,直接安裝到底座上,這樣,不用再拆開風扇,也能實現我的這個新的要求,但是現在就有乙個問題,安裝輪子的時候,要求底座上要有螺絲孔,否則還是沒辦法安裝,這就要求我們的設計人員,在設計的時候,盡可能的留出這些擴充套件的位置,以便以後擴充套件使用,當新增乙個需求時,能很快的完成這個需求但是還能做到盡少改變之前的方法,那麼就做到了「開閉原則」。

3、黎克特制代換原則(liskov substitution principle)

黎克特制代換原則,說的通俗點,就是子類可以代替父類的位置,而這個過程,系統不會感覺到差異。具體一點的話,就是子類必須實現父類的方法,重寫父類方法;(注意重寫和過載的區別)。

舉個例子來講,有乙個父親類,父親會伐木,他有乙個兒子,兒子類繼承了父親類的伐木方法,並且將它重寫(可以理解為父親用斧子砍樹,兒子用電鋸砍樹,最終的結果都是砍樹,只不過這個過程不一樣),並且他的兒子還有乙個唱歌的方法,這是他的父親不具備的。一天,乙個農場主想找父親幫忙砍樹,但是父親生病了,不能去,於是就派兒子去了,兒子到了那裡,砍完了樹,拿了工錢回家了,這個農場主並沒有感覺到有什麼奇怪,因為他的目的是找人把樹砍了,具體是兒子砍得還是父親砍得,對農場主來說是沒有區別的。這個時候,兒子類能在任何時候代替父親類的位置,而且別人並不會發現有什麼不一樣。這裡他們就遵循了黎克特制代換原則。

由於子型別的可替換性,使得使用父類型別的模組在無需修改的情況下就可以進行擴充套件。也即,子類必須能夠代替掉他們的父類型別

4、依賴倒轉原則(dependence inversion principle)

高層次的模組不應該依賴於低層次的模組,他們都應該依賴於抽象,抽象不應該依賴於具體,具體應該依賴於抽象。這是依賴倒轉原則的官方解釋,不太好理解。通俗點說,就是要針對介面程式設計,不要針對具體實現去程式設計,讓應用程式依賴於抽象,實現的細節也依賴於抽象。即使實現細節不斷變動,只要抽象不變,客戶程式就不需要變化。我開始學習的時候也是暈頭轉向的,這些詞說的都太寬泛了,下邊用乙個具體的例子來說明一下。

就拿我們在每天都能接觸到的電腦來說,大家都知道,電腦是由主機板,cpu,記憶體條,顯示卡等原件組成的,我們從來都沒有聽說過記憶體條壞了要把主機板也一起換了,我們只需要買乙個新的記憶體條換了就ok了,這是為什麼呢?電腦不應該是乙個十分精密的儀器麼,為什麼隨便買來乙個記憶體條插上就能用了呢?大家都知道,記憶體條有乙個叫做「金手指」的東西,而且不管哪乙個記憶體條,他們的金手指部分張的都是一樣的,也就是說,電腦的主機板廠商和記憶體廠商有這樣乙個協議,那就是,每個記憶體上都有乙個金手指,而主機板上都有讓金手指插拔的地方,這樣一來,雙方都依賴於這個「金手指」了,而不是具體的某塊記憶體,至於記憶體中是什麼樣的原理,如何運作,主機板並不關心,主機板要做的就是從金手指上讀取資料,(注意,主機板讀取的地方是「金手指」,而不是具體的某乙個記憶體),同樣的,主機板是什麼原理,內部如何運作,記憶體也不關心,記憶體要做的只是往金手指上輸出資料,至於有沒有人讀,誰來讀,都不是記憶體所關心的。這樣記憶體和主機板都不依賴於對方,那麼,只要有「金手指」的地方,記憶體和主機板就都可以正常的運作了。依賴倒轉原則大致就是這個意思。

5、迪公尺特法則(low of demeter)

迪公尺特法則,也叫最少知識原則。這個原則的核心就是「不和陌生人說話」,通俗的來講,就是乙個類,對於與自己相耦合的類來說,知道的越少越好。

舉個例子來說,小張是公司行政部的員工,一天,他的電腦壞了,不得已要麻煩技術部的人來解決,可是他不認識裡邊的員工,沒有人會來幫他,這個時候,如果他認識技術部的經理,那麼技術部經理就可以找他手下的人來幫助小張解決問題了。

在上邊的例子中,技術部是乙個抽象的概念,哪怕技術部的員工內部全都換成了新人,只要小張認識這個技術部的經理,那麼誰幫他修電腦,最後結果都是一樣的。而不必費盡心思去認識技術部的員工了。

規範一點的話,就是,如果兩個類之間不必進行直接通訊,那麼這兩個類就不應當直接發生耦合,如果乙個類血藥呼叫另乙個類的方法的話,可以通過第三者來**這個呼叫

6、介面隔離原則(inte***ce segregation principle)

介面隔離原則的核心精神是:盡量使用多個專門的單一的小介面,避免龐大的總介面;專業點的說法是類間的依賴關係盡量建立在最小的介面上。介面盡量的小,但是小不是說乙個介面乙個方法,小也要不違背單一職責原則。介面隔離強調介面的單一性,不要將一大堆介面暴露在使用者面前,那樣會造成嚴重的介面汙染,具體的介面小的程度,還需要在以後的實踐中才能更深刻的理解出來。

設計模式之六大原則

無規矩不成方圓,同樣的設計模式也有其內定的一些規則,這些規則使得我們更加方面的使用設計模式的各種模式。以下簡介六個原則 1 單一職責原則 定義 就乙個類而言,應該僅有乙個引起它變化的原因。解釋 如果乙個類承擔的職責過多,則就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其他職責...

設計模式之六大原則

設計模式 6大原則 概念 就乙個類而言,應該僅有乙個引起它變化的原因。解釋 所謂的單一職責,就是說乙個類能完成的功能只有乙個,如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。自我感覺乙個類就跟乙個人一樣,乙個人的精力是有限的,如果擔任過...

設計模式之六大原則

單一職責原則 單一職責原則 srp 乙個類而言,有且只有乙個引起它變化的原因。例子 攝像機和手機相比,攝像機攝像的職責單一,攝像效果清晰 程式設計時要做到單一職責,這樣的 易維護 擴充套件 復用 靈活多樣 開放 封閉原則 開放 封閉原則 軟體實體 類 模組 函式等 可以擴充套件,但是不可修改 對於擴...