1. 程式人生 > 其它 >設計模式六大原則

設計模式六大原則

設計模式中的六大原則

單一職責原則:就一個類而言,應該僅有一個引起它變化的原因。

開放封閉原則:軟體實體(類、模組、函式等等)應該可以擴充套件,但是不可以修改。

依賴倒轉原則:A、高層模組不應該依賴底層模組,兩個應該都依賴抽象;B、抽象不應該依賴細節,細節應該依賴抽象。

里氏代換原則:子型別必須能夠替換掉它們的父型別。

合成/聚合複用原則:儘量使用合成/聚合,儘量不要使用繼承。

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

原理解析

單一職責原則:指的是一個類應該只有一個功能為最佳,如果一個類的職責過多的話,某一個職責的變化就會削弱或抑制這個類完成其他職責的能力。單一功能也是軟體設計中需要考慮的問題,設計階段應該發現職責並分離職責。例如:手機的功能有很多,可以在一定程度上代替相機、遊戲機等,但是對於這些功能的實現,手機卻不如單個的相機和遊戲機來的好。而對於軟體開發來說,一個類的職責越多、功能越複雜,這個類的效能越差(這些效能包括可維護性、可擴充套件性、可複用性、靈活性),日後維護起來會違反下一個原則,就是開放封閉原則。

開放封閉原則:從名字上來看就可以得知,該原則包括兩個方面,一個是對擴充套件開放(Opened for extension),另外一個是對修改封閉(Closed for modification)。比如考研和求職,如果打算考研,那麼考研就是自己主要的狀態,這個狀態是不可以修改的;求職對於考研來說就屬於擴充套件狀態,可以在主狀態進行的累的時候去了解求職,這也就是說擴充套件自己的狀態。這個原則很大程度的體現了抽象,即對變化比較頻繁的部分進行抽象。開放封閉原則是面向物件設計的核心所在,這個原則給面向物件技術帶來了很大的好處,使得程式碼可維護、可擴充套件、可複用、靈活性好。

依賴倒轉原則:這個原則主要強調的是應該面向介面程式設計,而不是面向實現。依賴倒轉原則很大一方面體現了OO中的低耦合原則,可以說是面向物件設計的標識,它使得所有的類都去依賴介面,不管類怎麼變化,介面不變,那麼呼叫起來就比較方便。例如:電腦主機中的CPU的設計就體現了這個原則,CPU是完全封裝的,內部結構和功能不對外開放,但是很固定的就是對外介面一樣。不管哪個廠家生產的主機板,不管各種主機板是否一樣,只要有與CPU針腳匹配的插槽就可以了。如果說CPU不是面向介面的(固定針腳),那麼每種CPU都得對應生產一個主機板,一旦CPU損壞,那麼這個主機板也就廢了,不但資源浪費,而且生產時耗時耗力。

里氏代換原則:OO中的繼承要求,子類擁有父類所有的非private的行為屬性,關鍵點是在所有。那麼這個子類便可以替代父類去執行功能,而且不會程式的行為不會變化,這樣才真正的做到了父類被複用。正是由於子類可以替代父類,才使得開放封閉原則有了可能,否則便無法做到可擴充套件。

合成/聚合原則:合成和聚合是類的關聯關係中的不同形式,合成是一種強擁有關係,聚合是弱擁有關係。它強調類之間儘量用合成/聚合關係,少用繼承關係,因為如果子類的太多的話,繼承的層次會變得特別多,那麼就會造成子類和父類之間的耦合度非常高,如果需要改動其中某一部分,那麼就會影響其他部分,使得程式碼可維護性和可擴充套件性非常低,違反了面向物件思想的原則。

迪米特法則:迪米特法則的根本思想是強調類之間的鬆耦合,在類的結構設計上,每一個類都應當儘量降低成員的訪問許可權。比如:公司裡的A部門需要B部門協助做些工作,那麼就應該直接找B部門的部門經理,讓部門經理安排誰協助A部門工作,而不是將命令給B部門某一個人。如果是直接將命令給B部門的某一個人了,那麼這個人一旦有事耽擱了,那麼這件事也就耽擱了。如果是直接找B部門經理,那麼如果其中一個人有事,則經理直接安排別人去做這項工作。如果將這兩個部門比作類,就相當於兩個類耦合度降低,這樣即使某一個類被修改,對另外一個類的影響不是很大。

總結

這六項原則說到底其實就是面向物件思想的體現,OO的三大特點是繼承、封裝、多型,OOT很重要的一項要求就是程式碼的可維護性、可複用性、可擴充套件性、靈活性要好,而這六項原則的應用就是為了讓各個設計模式向OO的這些要求和特徵靠攏。

原文連結:https://blog.csdn.net/fengyao1995/article/details/40951191