女朋友非要問我什么是設計模式!
下面讓我們跟著碼仔一起來認識一下設計模式吧!
通過這篇文章你能學到什么?
- 什么是設計模式?
- 我們為什么要學習設計模式?
- 常用的設計模式有哪些?
- 我們應該如何學習設計模式?
什么是模式?什么是設計模式?
什么是模式?我們先從字面意思來理解,“模”:模型、模具,我們可以看做是一種標準,“式”:形式、方式,我們可以看做是一種方法,兩者組合在一起就是“標準化的方法”叫做模式。
舉個很恰當了例子:中國的四大發明之一,活字印刷術的誕生過程就是一種模式的產生。在沒有活字印刷術之前,每頁文字刻成一個板子,如果一個字錯了就得重新雕刻,錯誤率很高,成本也高,效率還低。之后演變成為每個字為單獨小板,印刷文章的時候只需要在大板子上根據需求排列不同的字就可以了,這些字不僅雕刻起來錯誤率低,還可以重復不同的文章使用。這是一種標準化方法的演變過程,也是一種模式的誕生。
每個模式都描述了一類我們在生產環境中遇到的問題,并且給出了解決這個問題的核心方案。所以在我們遇到這類問題時,使用這些方案就可以避免重復的工作。簡而言之:模式是在特定環境下,人們解決某類重復出現問題的一套成功或有效的解決方案。
上面我們了解了模式,但有的朋友該說了,我們是軟件開發工作者,知道模式有什么用呢?別著急,下面我們就來認識一下軟件模式。
軟件模式,如果按剛才我們理解的“模式”,軟件模式就可以解讀為:軟件生命周期內的一些標準化方法。我們知道軟件的生命周期并不單單只開發周期,軟件前期的需求分析,后期的迭代維護都屬于軟件的生命周期,所以相對應的在每個階段都會有對應的模式。作為開發者我們接觸最多的就是開發階段,而在開發階段使用最多的應該就是設計模式了。那什么又是設計模式呢?
據網上搜索得知:設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解并且保證代碼可靠性。其實說白了,設計模式就是經過無數填坑人的努力所總結的一套標準化的被所有開發者承認的代碼設計方案。
設計模式一般包含模式名稱、問題、目的、解決方案、效果等組成要素,其中關鍵要素是模式名稱、問題、解決方案和效果。
模式名稱(Pattern Name)通過一兩個詞來描述模式的問題、解決方案和效果,以便更好地理解模式并方便開發人員之間的交流,絕大多數模式都是根據其功能或模式結構來命名的;
問題(Problem)描述了應該在何時使用模式,它包含了設計中存在的問題以及問題存在的原因;
解決方案(Solution)描述了一個設計模式的組成成分,以及這些組成成分之間的相互關系,各自的職責和協作方式,通常解決方案通過UML類圖和核心代碼來進行描述;
效果(Consequences)描述了模式的優缺點以及在使用模式時應權衡的問題
個人感覺這些已經很全面的解釋了什么是設計模式,之后我也打算從這四個方面去分析每一種模式。
為什么要學習設計模式?
認識完設計模式我們肯定會產生以下疑問?我們為什么要學習設計模式?它在我們開發當中都解決了哪些問題?
通過學習我覺得學習設計模式可以解決以下三個問題:
1、避免重復造輪子
學習計算機我們肯定都聽過這句話“不要重復造輪子”,設計模式首先解決的就是我們重復造輪子的問題。
舉個栗子:在沒有學習設計模式的時候,我們使用圖片加載或者其他工具類,肯定是經過大量的編程,走過很多彎路,填過很多坑才會想到“我們應該封裝一下,單獨一個實例這樣更加便于管理”,于是我們開始封裝,廢了好大勁封裝成功,之后學習完 “單例模式”發現,咦,這不就是我封裝的那個方式么?如果早學了設計模式,我就。。。。所以,在時間就是金錢的今天,設計模式無疑會為有助于我們提高開發和設計效率,但也不保證一定會提高。
2、降低溝通成本
工作中我們不可能是一直獨立開發,肯定會跟別人協調開發。只要有合作就少不了溝通,設計模式也能解決開發人員之間的溝通問題。
再舉個栗子:你從零開發了一個項目,后來項目越做越大,功能模塊也越來越多,多到你天天加班也弄不完的情況,這個時候你向老板提出“漲工資不然不干了,然后老板開始給你各種畫餅。。。”(扯遠了),這時候你向老板提出需要一個幫手,然后老板給你招來一個小弟,你需要帶他熟悉項目,你對他說我這個地方用了“單例模式”,這里用了“裝飾者模式”,然后這里是“工廠模式”,然后小弟懵逼了。然后你還得費好大勁去講解你是怎么實現的這些模式。。。很顯然小弟并不了解設計模式,不然你就可以省下很多時間多寫幾個bug了。
因為設計模式提供了一套通用的設計詞匯和一種通用的形式來方便開發人員之間溝通和交流,使得設計方案更加通俗易懂,所以無論你使用哪種編程語言,做什么類型的項目,甚至你處于一個國際化的開發團隊,當面對同一個設計模式時,你和別人的理解并無二異,因為設計模式是跨語言、跨平臺、跨應用、跨國界的。
3、優秀的復用性和可擴展性
上大學的時候我們學過,一個優秀的軟件需要有六大特性:功能性、可靠性、可用性、效率、可維護性、可移植性。然而很多開發人員在開發的時候多半不會考慮這些東西。因為國內的開發環境大多是先出結果,出問題了再說。所以,如何在有限的時間內開發出優秀的軟件是成為優秀開發人員的必修之路。大部分設計模式都兼顧了系統的可重用性和可擴展性。例如:代碼中經常使用某個功能,我們可以使用“單例模式”把他封裝起來,如果考慮某個地方的可擴展性,我們可以使用“裝飾模式”等等。
為什么要學習設計模式?
經過無數前輩的總結,常用的設計模式主要有23種,而這23種設計模式又可以分為三大類:創建型模式(5種)、結構型模式(7種)和行為型模式(11種)。其中創建型模式主要用于描述如何創建對象,結構型模式主要用于描述如何實現類或對象的組合,行為型模式主要用于描述類或對象怎樣交互以及怎樣分配職責。下圖是23種模式的具體分類:表格展示
如何學習?
在我們正式開始學習之前我想先分享下我對設計模式學習的看法。
我從大學開始接觸設計模式,畢業后我也從事了近三年的開發工作。在這期間我體會到了設計模式的種種便利,也了解一些朋友對設計模式的看法。在這里我想分享一下自己學習設計模式的心得體會,供大家參考:
1、不要畏懼。
工作期間我跟很多同事談論過設計模式,他們大多數的反應是“那個感覺挺難的,現在沒打算去學。”很多人還沒開始就已經退縮了。其實掌握設計模式并不是很難的事情,我們只需要拆分他們,一個一個模式去熟悉,一個例子一個例子去看、去模仿,多思考,多實踐,一定可以掌握。關鍵是要開始去學。
2、抓住重點。
其實學習每一個設計模式只需要抓住以下幾點,我們就能大概掌握這種模式。
- 這個設計模式是要解決什么問題,需要在那種情況下使用?
- 這個設計模式的結構圖是什么樣的?
- 這個設計模式的優缺點分別是什么?
- 在現實和代碼中分別能舉出什么樣的使用該模式的例子?
3、親身實踐。
老話說:“紙上得來終覺淺,絕知此事要躬行”,看十遍例子也不如敲一遍代碼,一定要把例子敲一遍,并且舉一反三自己設計例子。這樣才能記得牢固。
4、不能濫用。
千萬不要濫用模式,不要剛學了一兩個模式就想在代碼中硬套。每個模式都有自己的適用場景,不能為了使用模式而使用模式。要做到具體情況具體分析,濫用設計模式很可能寫出一堆垃圾代碼。
5、活學活用。
我這里直接用劉偉老師的總結來解釋。設計模式的“上乘”境界:“手中無模式,心中有模式”。模式使用的最高境界是你已經不知道具體某個設計模式的定義和結構了,但你會靈活自如地選擇一種設計方案【其實就是某個設計模式】來解決某個問題,設計模式已經成為你開發技能的一部分,能夠手到擒來,“內功”與“招式”已渾然一體,要達到這個境界并不是看完某本書或者開發一兩個項目就能夠實現的,它需要不斷沉淀與積累,所以,對模式的學習不要急于求成,要循序漸進。
模式從不保證任何東西,它不能保證你一定能夠做出可復用的軟件,提高你的生產率,更不能保證世界和平。模式并不能替代人來完成軟件系統的創造,它們只不過會給那些缺乏經驗但卻具備才能和創造力的人帶來希望。