【前言】設計模式的原則是設計模式的需要遵守的規範,設計模式滿足的規則越多那麼這個模式也就越精闢,我們根據設計自己的**結構的時候要把遵循這些原則作為前提,否則維護時的代價就是巨大的。
就乙個類而言,應該僅有乙個引起它變化的原因。
這是什麼意思呢,就想我們如果在乙個類裡面包含了很多功能,比如訪問資料庫、運算演算法等,只要我們需要換一種資料庫,那我們就必須去修改這個類,是不是聞到了壞**的味道,這就違反了我們的開放
-封閉原則。
遵循單一原則的優點:
·可以降低類的複雜度,乙個類只負責一項職責,其邏輯肯定要比負責多 項職責簡單的多;
·提高類的可讀性,提高系統的可維護性;
·變更引起的風險降低,變更時必然的,如果單一原則遵循的比較好,那麼可以顯著降低對其他功能的影響。
軟體實體可以擴充套件但是不能修改。
也對是要求我們的軟體實體對擴充套件開放,對修改關閉。對應到我們學過的內容就是寫乙個運算抽象類,然後讓這些加減乘除子類繼承運算類,如果我們想要新增乙個取餘的演算法只需要再寫乙個子類就行啦,不用對抽象類進行修改。想要運用好開閉原則,就要在剛開始設計的時候就要考慮好,抽象要合理,對需求的變更具有前瞻性和預見性。
抽象不應該依賴細節,細節應該依賴於抽象,針對介面程式設計,不要對實現程式設計;高層模組不應該依賴底層模組,兩個都應該依賴抽象。
我覺得要理解依賴倒轉原則主要就是理解面向介面程式設計,我們的目標不是為了實現某些功能,而是去設想有什麼需要的功能,然後編譯為介面,當我們需要實現這些功能的時候只需要去繼承這些介面就行,而且發生變化時的可擴充套件性也比較強。
我們常見的電腦主機板、
cpu、記憶體條等都是針對介面程式設計的,如果
cpu壞了,我們只需要換乙個新的
cpu就可以,對其他元件是沒有影響的。但是如果他們是焊接在一起的,那麼乙個損壞了可能所有的元件都不能正常工作了,所以說針對介面程式設計使得靈活性大大增強。
乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,而且覺察不出父類物件和子類物件的區別。也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。簡單理解:子型別必須能夠替換掉它們的父型別。
黎克特制代換原則主要是針對於繼承的,當子類繼承父類的子類必須擁有父類的所有屬性,在此基礎上可以有自己獨特的方法或屬性。我們寫了乙個父類是鳥類,父類有乙個屬性是飛翔;但是企鵝不會飛,所以企鵝就不能繼承父類,再程式設計的角度來看企鵝不是鳥。
如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用,如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三者**這個呼叫。
這是減少耦合的乙個原則,感覺和中介者有一點像。舉個栗子,小明和小紅是同事,小亮和小紅是鄰居,現在小明有東西要給小亮,就可以讓小紅回家的時候帶給小亮,這樣就不用單獨跑一趟了。好像有點不恰當哈,反正根本原則就是抵制強耦合,盡量讓少的類存在耦合關係。
盡量使用合成
/聚合關係,盡量不要使用類繼承。
過多的繼承是類與類之間的耦合關係增強,所以我們應該在使用繼承的時候想一下可否使用聚合和組合關係。有限使用物件的組合、聚合有助於保持每個類被封裝,並集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能會增長成為不可控制的龐然大物。
下面是在網上看到的乙個舉得很不錯分享給大家:
(圖來自卡奴達摩的部落格)
【總結】
單一職責原則告訴我們實現類要職責單一;黎克特制替換原則告訴我們不要破壞繼承體系;依賴倒置原則告訴我們要面向介面程式設計;迪公尺特法則告訴我們要降低耦合。而開閉原則是總綱,他告訴我們要對擴充套件開放,對修改關閉。合成聚合復用告訴我們避免過多繼承。
設計模式之設計原則
設計模式 design pattern 是物件導向技術的最新進展之一,由於物件導向設計的靈活性,增加了其設計的複雜性,設計模式的出現就是為了提高復用的設計方案,讓 更容易被他人理解 保證 可靠性。設計模式於己於他人於系統都是多贏的,設計模式使 編制真正工程化,設計模式是軟體工程的基石,如同大廈的一塊...
設計模式之設計原則
類應該對擴充套件開放,對修改關閉。使用介面及抽象類實現 目的 減少影響原有的方法 高層模組不應該依賴低層模組,兩者都應該依賴其抽象。依賴抽象類,不要依賴具體類 針對介面程式設計,不要針對實現程式設計 目的 解耦合 就乙個類而言,應該僅有乙個引起它變化的原因 當乙個類耦合了多個職責,當其中乙個職責發生...
設計模式之設計原則
1 單一職責原則 srp 1 就乙個類而言,應該僅有乙個引起它變化的原因。2 軟體設計真正要做的許多內容,就是發現職責並把那些職責相互分離。2 開放 封閉原則 1 軟體實體 類 模組 函式等等 對於擴充套件是開放的,對於更改是封閉的。2 在我們最初編寫 時,假設變化不會發生,當變化發生時,我們就建立...