值得反覆品味的面向對象設計模式

本文原創,轉載請註明出處。
歡迎關注我的 簡書 ,關注我的專題 Android Class 我會長期堅持爲大家收錄簡書上高質量的 Android 相關博文。

週末了擁有大塊時間,是一個充電的好時機,本文給大家帶來設計模式的讀書筆記,希望能給你帶來一些幫助。

前文:
值得反覆品味的面向對象六大原則

設計模式

在軟件工程中,設計模式是對軟件設計中普遍存在、反覆出現的各種問題所提出的通用解決方案。這個術語是由 Erich Gamma 等人在1990 年從建築設計領域引入到軟件工程領域,從此設計模式在面向對象設計領域逐漸被重視起來。

設計模式並不直接用來完成代碼的編寫,而是描述在各種情況下要如何解決軟件設計問題。面向對象設計模式通常以類或對象來描述其中的關係和相互作用,他們的相互作用能夠使軟件系統具有高內聚、低耦合的特性,並且使軟件能夠應對變化。

模式的4個要素

模式名稱
模式名稱用一兩個詞來描述模式的問題、解決防範和效果。基於一個模式詞彙表,同行、同事之間就可以通過它們進行交流,文檔中也可以通過模式名來代表一個設計。模式名可以幫助我們思考,便於我們與其他人交流設計思想以及設計結果。

問題
描述了應該在什麼情況使用設計模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,例如,某個設計不具備良好的可擴展性等,也可能描述了導致不靈活設計的類或者對象結構。

解決方案
描述了設計的組成成分,它們之間的相互關係以及各自的職責和協作方式。因爲模式就像一個模板,可應用於多種不同的場合,所以解決方案並不描述一個具體的設計或者實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的類或者對象組合來解決這個問題。

效果
描述了模式應用的效果及使用模式應權衡的問題。儘管我們描述設計決策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題。因爲複用是面向對象的設計要素之一。所以模式效果包括對它系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。

設計模式爲反覆出現的局部軟件設計問題指出了通用的解決方案,在很大程度上促進了面向對象軟件工程的發展。它將這些常見的設計問題一一總結,將大師們的經驗、教訓、設計經驗分享給了所有人,使得即便是剛剛入行的工程師,也能夠設計出可擴展、靈活的軟件系統,大大提升了軟件質量。關於設計模式領域的書籍大家可以參考《設計模式之禪》、《Android 源碼設計模式解析與實戰》。

避免掉進過度設計的怪圈

當你掌握一些設計模式或者手法之後,比較容易出現的問題就是過度設計。有的人甚至在一個應用中一定要將 23 種常見的設計模式運用上,這就本末倒置了。設計模式的四大要素中就明確指出,模式的運用應該根據軟件系統所面臨的問題來決定是否需要使用現有的設計。也就是說,再出現問題或者你預計會出現那樣的問題時,才推薦使用特定的設計模式,而不是將各種設計模式套進你的軟件中。

不管在設計、實現、測試之劍有多少時間都應該避免過度設計,它會打破你的反饋迴路,使你的設計得不到反饋,從而慢慢陷入危險中。所以你只需要保持簡單的設計,這樣就有時間來測試該設計是否真的可行,然後作出最後的決策。

當設計一款軟件時,從整體高度上設定一種架構模式,確定應用的整體架構,然後再分析一些重要米快的設計思路,並且保證他們的簡單性、清晰性,如果有時間可以使用 Java 代碼模擬一個簡單的原型,確保設計是可行的,最後就可以付諸行動了。切實不要過度的追求設計,適當就好,當我們發現或者預計到將要出現問題時,在判斷是否需要運用設計模式。

反模式

反模式是一種文字記錄形式,描述了對某個問題必然產生的消極後果的常見解決方案。由於管理人員或者開發人員不知道更好的解決方案,缺乏決定特定問題的經驗或知識,或者說不適合的條件下套用了某個設計模式,這些都會造成反模式。與設計模式類似,反模式描述了一個一般的形式,主要原因、典型症狀。後果,以及最後如何通過重構解決問題。

反模式是把一般情況映射到一類特定解決方案的有效方法。反模式的一般形式爲它所針對的哪類問題提供了一個易於辨識的模板。此外,它還清楚地說明了與該問題相關聯的症狀以及導致這一問題的內在原因:把特定設計模式應用於不正確的環境。

反模式爲識別軟件行業反覆出現的問題提供了實際經驗,併爲大多數常見的問題提供了詳細的解決方案。反模式對業界常見的問題進行總結,並且告訴你如何識別這些問題以及如何解決。它有效的說明了可以在不同的層次上採取的措施,以便改善應用開發過程,軟件系統和對軟件項目的有效管理。

總的來說,設計模式總結了在特定問題下正確的解決方案,而反模式則是告訴你在特定問題上的錯誤解決方案和他們的原因、解決方案,通過最終的解決方案,它能夠將腐化的軟件系統拉回正軌。

總結

靈活的軟件設計需要知識和經驗與思考,好的設計通常是經歷了時間的洗禮慢慢演化而來,工程師的成長也是一樣。因此,掌握必要的面向對象、設計模式、反模式等知識,並且這工作中不斷實踐、思考,將使你的軟件設計之路走得更加從容、順暢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章