劉冉亭 廊坊師範學院資訊科技提高班十四期
單一職責原則(SRP)
定義 就一個類而言,應該僅有一個引起它變化的原因 如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意向不到的破壞
理解: 講一個關於小貓釣魚的故事吧。小貓和媽媽去釣魚,剛坐下釣魚沒有多久看到周圍有蜻蜓飛過,小貓放下魚竿去捉蜻蜓了,蜻蜓飛的太快,小貓沒有捉到,回去繼續釣魚,不一會兒,有蝴蝶從身邊飛過,小貓看著漂亮有去捉蝴蝶了,蝴蝶也飛的很快,飛走了,小貓沮喪的回來了,看到媽媽釣到了大魚,自己的籃子卻是空空的,媽媽教導了小貓,釣魚需要一心一意,才可以,這次小貓坐在原地等著釣魚,一段時間後果然釣到了魚兒。 通過這個故事可以看出小貓在釣魚的時候捉蜻蜓捉蝴蝶會影響釣魚,釣魚和捉蜻蜓發生了耦合,當專心做一件事情的時候才會成功。 軟體設計也是如此真正要做的許多內容,就是發現職責並把那些職責相互分離,當多於一個動機去改變一個類,那麼這個類就具有多於一個的職責,就應該考慮類的職責分離。
里氏替換原則
定義: 子類必須能夠替換掉它們的父型別 一個軟體實體如果使用的是一個父類的話,那麼一定適用於其子類,而且不察覺出父類物件和子類物件的區別。 作用:當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被複用,而子類也能夠在父類的基礎上增加新的行為。
理解: 在西遊記裡真假美猴王裡的孫悟空,六耳獼猴和孫悟空簡直就是一個模子裡刻出來的,拿孫悟空作為父類來說,六耳獼猴作為子類, 六耳獼猴有筋斗雲會七十二變,也有緊箍咒,等等,就很好的體現了里氏替換。
依賴倒轉原則
定義 高層模組不應該依賴底層模組。兩個都應該依賴抽象 抽象不應該依賴細節。細節應該依賴抽象
理解 面向過程的開發,上層呼叫下層,上層依賴於下層,當下層劇烈變動時上層也要跟著變動,這就會導致模組的複用性降低而且大大提高了開發的成本。依賴倒轉很好的解決了這個問題; 主要針對介面程式設計,不要對實現程式設計 依賴倒轉可以說是面向物件設計的標誌,用哪種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是面向物件的設計,反之就是程式化的設計
開放—封閉原則
定義 軟體實體(類、模組、函式等等)應該可以擴充套件,但是不可修改
特徵: 對於擴充套件是開放的(有新的需求或變化時,可以對現有程式碼進行擴充套件,以適應新的情況。) 對於更改是封閉的(類一旦設計完成,就可以獨立完成對應工作,而不要對類進行任何修改。)
理解 開放—封閉原則是面向物件設計的核心所在, 好處:可維護、可擴充套件、可複用、靈活性好, 有了里氏替換原則,才使得開放—封閉原則成為了可能,由於子型別的可替換性才使得使用父類型別的模組在無需修改的情況下就可以擴充套件
迪米特法則(LoD)
定義 如果兩個類都不彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用,如果其中一個類需要呼叫另一個類的某一個方法的話,可以通過第三者轉發這個呼叫。
理解 買衣服的故事,家長給小孩子買來件漂亮的衣服,服務員A開票,家長把衣服拿回來穿上有些小,這時候家長在拿回來換,可是剛在賣衣服的服務人員A不在了,那該怎麼辦呢?家長拿出小票,服務人員B一看就知道這是本家的衣服了。這樣家長通過小票的證明就可以及時的更換衣服了。 迪米特法則的根本思想:強調了類之間的鬆耦合。類之間的耦合越弱,若有利於複用,一個處在弱耦合的類被修改,不會對有關係的類造成波及。
合成/聚合複用原則(CARP)
定義 儘量使用合成/聚合,儘量不要使用類繼承 聚合:表示一種弱的“擁有”關係,體現的是A物件可以包含B物件,但B物件不是A物件的一部分; 合成則是一種強的“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。 好處:優先使用物件的合成/聚合將有助於保持每個類都被封裝,並被集中子在單個任務上。這個樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物
關於設計模式的六大原則就說到,這裡了,感謝大家的閱讀,如有問題,歡迎交流