萬變不離其宗 設計模式六大原則

2021-09-01 17:32:16 字數 3067 閱讀 4152

我們先不談所謂的原則,首先來了解一下什麼是模式。顧名思義,模式就是我們在解決相同或者類似問題的經驗或者方案,是業已成型的東西,通過模式的應用可以讓問題的解決更加的快速高效,可以讓我們站在巨人的肩膀上來思考問題,俯視我們的設計。那麼模式又是如何形成的?如果它沒有乙個為人認可的宗旨肯定不能走到今天,萬變不離其宗。那麼設計模式的宗旨又是什麼呢?個人理解其實就是兩個字:解耦。設計模式正是通過遵循下面的幾個原則來實現解耦的。

開放—封閉原則(ocp,open closed principle )——核心

定義:是說軟體實體(類、模組、函式等等)應該可以擴充套件,但是不可修改。

對於擴充套件是開放的(open for extension),對於更改時封閉的(closed for modification)

應用:

開—閉原則使系統在面對需求改變的時候可以保持相對穩定,從而可以在第乙個版本以後不斷推出新的版本。

當然啦,無論模組是多麼的「封閉」,都會存在一些無法對之封閉的變化。既然不可能完全封閉,設計人員必須對於他設計的模組應該對那種變化封閉做出選擇。他必須先猜測出最有可能發生的變化種類,然後構造抽象來隔離那些變化。

我們最初編寫**時,假設變化不會發生。當變化發生時,我們就建立抽象來隔離以後發生的同類變化

開—閉原則是物件導向設計的核心所在。遵循這個原則可以帶來物件導向技術所聲稱的巨大好處,也就是可維護、可擴充套件、可復用、靈活性好。開發人員應該僅對程式中呈現出頻繁變化的那些部分作出抽象,然而,對於應用程式中的每個部分都刻意地進行抽象同樣不是乙個好主意。拒絕不成熟的抽象和抽象本身一樣重要。其實,這就是乙個取捨的度,知道自己要什麼和清楚自己不需要什麼一樣重要。任何多餘的東西都是負累。要想做到「增乙個則多,少乙個則寡」的境界還是依靠平時的積累和總結的。

依賴倒轉原則(dip,dependence inversion principle )——標誌

定義:a.高層模組不應依賴低層模組。兩個都應該依賴抽象。

b.抽象不應該依賴細節。細節應該依賴抽象。

應用:

針對介面程式設計,不對實現程式設計

依賴倒轉原則其實可以說是物件導向設計的標誌,用哪種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是物件導向的設計,反之,就是過程化的設計了。

liskov代換原則(lsp,liskov substitution principle )

定義:子型別必須能夠替換掉它們的父型別

應用:

乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,而且它察覺不出父類物件和子類物件的區別。也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。正是由於子型別的可替換性才使得使用父類型別的模組在無需修改的情況下就可以擴充套件。由於黎克特制代換原則才使得開放—封閉原則成為可能。

在上面的依賴倒轉原則中提到,抽象不應依賴於細節,細節應該依賴於抽象。那我們是不是可以這樣來理解:無論是父類還是子類,它們都依賴於抽象出來的那個類,它們的屬性和方法是一致的,是相同的,所以父類物件和子類物件是沒有區別的,自然子類就可以神不知鬼不覺的替代父類而不影響程式的行為。

單一職責原則(srp ,single responsibility principle )

定義:就乙個類而言,應該只有乙個引起它變化的原因

應用:如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計就會遭到嚴重破壞,甚至要推倒重來。

軟體設計真正要做的許多內容,就是發現職責並把那些職責相互分離。就是讓類有且只有乙個職責,並且把這個職責做好就ok了。每個類都各司其職,就像公司裡責任到人的機制一樣。集體負責只能導致集體不負責,就容易出現互相扯皮,導致工作效率低下,所以還是單一職責效率高。同理,具有單一 職責的類在實現功能上效率才高,這樣**才能真正做到易維護、易擴充套件、易復用、靈活多樣。

迪公尺特法則(lod,law of demeter) 又叫最少知識原則(lkp ,least knowledge principle)

定義:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三者**這個呼叫。

應用:

在類的結構設計上,每乙個類都應當盡量降低成員的訪問許可權,就是說乙個物件應當對其他物件有盡可能少的了解,有點類似於不和陌生人說話 。

迪公尺特法則的根本思想是強調了類之間的松耦合。類之間的耦合越弱,越有利於復用,乙個處在弱耦合的類被修改,不會對有關係的類造成波及。也就是說資訊的隱藏促進了軟體的復用(類似封裝的作用)。

舉例:

中介者模式

合成/聚合復用原則(carp,composite/aggregate reuse principle)

定義:盡量使用合成/聚合,盡量不要使用類繼承

合成(composition也作組合)和聚合(aggregation)都是關聯的特殊種類。

聚合表示一種弱的擁有關係,體現的是a物件可以包含b物件,但b物件不是a物件的一部分。就比如說花園裡有很多花,花園和花之間就是一種聚合關係,a表示花園,b表示花園中的其中一朵,即使沒有了b,a依然是花園。

合成則是一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。a表示花,b表示花根。花和花根就是一種合成關係。沒有了b(花根),a的生命也將終結,它們同生共死。

應用:

合成/聚合復用原則的好處就是優先使用物件的合成/聚合將有助於保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物。

為什麼要盡量使用合成/聚合復用而不是類繼承呢?

1.物件的繼承關係在編譯時就定義好了,所以無法在執行時改變從父類繼承的子類的實現

2.子類的實現和它的父類有非常緊密的依賴關係,以至於父類實現中的任何變化必然會導致子類發生變化

3.當你復用子類的時候,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或者被其它更適合的類所替換

4.這種依賴關係限制了靈活性,並最終限制了復用性

程式優化總結 萬變不離其宗

程式優化總結 萬變不離其宗 空間優化,時間優化.目前我們就在pc上,所以主要目標是時間優化.第一步 演算法結構層面的優化.搞懂演算法,從巨集觀層面優化結構,能在乙個層面做的事情,盡量合併一起做 第二步 c語言層面的優化.從函式,語言層面優化程式 1.減少記憶體訪問 2.合併運算 3.空間換時間 4....

程式優化總結 萬變不離其宗

空間優化,時間優化.目前我們就在pc上,所以主要目標是時間優化.第一步 演算法結構層面的優化.搞懂演算法,從巨集觀層面優化結構,能在乙個層面做的事情,盡量合併一起做 第二步 c語言層面的優化.從函式,語言層面優化程式 1.減少記憶體訪問 2.合併運算 3.空間換時間 4.迴圈合併 展開等處理 5.查...

萬變不離其宗之UART要點總結

首先這玩意兒分兩種 線上空閒 無資料狀態為常高電平,故邏輯低定義為起始位。停止位 波特率 bit rate 就是位 秒的概念,就是1秒傳多少位的概念。常見的波特率有哪些呢?這裡須注意的要點 兩邊分別代表兩個通訊的裝置,單從uart程式設計的角度講收發不需要物理同步握手,想發就發。圖中箭頭代表資料資訊...