1荣赶、什么是設(shè)計模式(Design Pattern)?
一個設(shè)計模式首先描述了一個在我們的環(huán)境中不斷重復發(fā)生的問題,然后描述了解決這個問題的方法的核心。
換句說話磁滚,一個設(shè)計模式是一個三方規(guī)則,描述了一個特定內(nèi)容宵晚、一個問題和一個對應(yīng)解決方法的關(guān)系。
2维雇、為什么要學習設(shè)計模式淤刃?
設(shè)計模式是一種知識和經(jīng)驗,和編程語言無關(guān)吱型。熟練的掌握各種設(shè)計模式后逸贾,程序猿們可以快速識別出一個系統(tǒng)的骨骼框架,也可以快速的搭建出一個健壯高效的系統(tǒng)。
設(shè)計模式就像是程序猿們心中的一張張藍圖铝侵,握住它們灼伤,就可能成為一位有大局觀的架構(gòu)師;松開它們咪鲜,注定是顆默默無聞的螺絲釘狐赡。
3、設(shè)計模式的分類
設(shè)計模式的分類方式有很多種疟丙,目前比較權(quán)威的分類方式(《Design Patterns: Elements of Reusable Object-Oriented Software》)是將其分為三類:結(jié)構(gòu)模式(Structural Patterns)颖侄、行為模式(Behavioral Patterns)以及創(chuàng)建模式(Creational Patterns)。
結(jié)構(gòu)模式:解耦多個類享郊;引入一個抽象類用于將來的擴展览祖;封裝復雜的結(jié)構(gòu)。
行為模式:允許算法和對象職責分配之間的選擇(“誰做什么”)炊琉;簡化在運行時難以追蹤的復雜的控制流展蒂。
創(chuàng)建模式:為復雜的初始化流程提供一個清晰簡單的視角;讓系統(tǒng)中對象的創(chuàng)建苔咪、組合和表達方式與系統(tǒng)本身獨立開來玄货。
4、設(shè)計模式舉例
篇幅所限悼泌,所以只選取了兩個典型的設(shè)計模式來進行講解松捉,分別為Adapter(Structural Pattern) 和Observer(Behavioral Pattern)。
Adapter
遇到的問題:新的系統(tǒng)需要使用舊的不兼容組件馆里,盡量不修改舊的組件隘世。
目標:提供訪問舊組件的入口。
應(yīng)用場景:假設(shè)舊組件LegacyRectangle擁有一個display方法鸠踪,接收x1丙者、y1、w营密、h四個參數(shù)來展示長方形械媒,但是在新系統(tǒng)中客戶期望輸入x1、y1评汰、x2纷捞、y2四個參數(shù)來展示長方形。在客戶是上帝的假設(shè)下被去,我們怎樣才能既重用舊組件(減少開發(fā)新組件的成本)又滿足客戶的需求呢主儡?
解決方案:在Rectangle(Adapter)中將x1、y1惨缆、x2糜值、y2轉(zhuǎn)換成LegacyRectangle所需的x1丰捷、y1、w寂汇、h病往,然后調(diào)用LegacyRectangle中的display方法。
Observer
遇到的問題:一個對象經(jīng)常改變它的狀態(tài)骄瓣,有多個視圖需要展示這個對象的當前狀態(tài)停巷。
目標:通過定義一個一對多的依賴,使當某一個對象(Publisher)的狀態(tài)改變時累贤,所有它的依賴者們(Subscriber)都將被通知并且自動更新狀態(tài)叠穆。
應(yīng)用場景:使用電腦的人都知道,我們可以在很多地方修改同一個文件的名字臼膏,比如以下地方(以Mac電腦為例)硼被。
那么大家有沒有思考過,當我們在某一個地方修改名字后渗磅,操作系統(tǒng)會做什么嚷硫?所有地方都會立刻更新成修改后的新名字嗎?跟我們在哪個地方修改名字會有關(guān)系嗎始鱼?
解決方案:
小 結(jié)
生活中模式無處不在仔掸,無論你是修橋梁還是種莊稼,代碼里面設(shè)計模式也無處不在医清,因為它們都是經(jīng)過殘酷的考驗后流傳下來的寶貴經(jīng)驗起暮,值得借鑒和學習。
學習設(shè)計模式和讀書一樣会烙,讀書是為了培養(yǎng)甚至灌輸給我們正確的價值觀负懦,但是有很多時候,卻是讓我們了解柏腻,要達到一個所謂正確的價值觀纸厉,這條道路有多么漫長,多么崎嶇五嫂。
本文作者:黃文博(點融黑幫)颗品,現(xiàn)就職于點融網(wǎng)成都團隊移動組,畢業(yè)于慕尼黑工業(yè)大學沃缘,主修計算機科學與技術(shù)躯枢。曾就職于騰訊北京、西門子慕尼黑總部孩灯,并曾兩度創(chuàng)業(yè)闺金。