1、什么是設計模式(Design Pattern)?
一個設計模式首先描述了一個在我們的環境中不斷重復發生的問題,然后描述了解決這個問題的方法的核心。
換句說話,一個設計模式是一個三方規則,描述了一個特定內容、一個問題和一個對應解決方法的關系。
2、為什么要學習設計模式?
設計模式是一種知識和經驗,和編程語言無關。熟練的掌握各種設計模式后,程序猿們可以快速識別出一個系統的骨骼框架,也可以快速的搭建出一個健壯高效的系統。
設計模式就像是程序猿們心中的一張張藍圖,握住它們,就可能成為一位有大局觀的架構師;松開它們,注定是顆默默無聞的螺絲釘。
3、設計模式的分類
設計模式的分類方式有很多種,目前比較權威的分類方式(《Design Patterns: Elements of Reusable Object-Oriented Software》)是將其分為三類:結構模式(Structural Patterns)、行為模式(Behavioral Patterns)以及創建模式(Creational Patterns)。
結構模式:解耦多個類;引入一個抽象類用于將來的擴展;封裝復雜的結構。
行為模式:允許算法和對象職責分配之間的選擇(“誰做什么”);簡化在運行時難以追蹤的復雜的控制流。
創建模式:為復雜的初始化流程提供一個清晰簡單的視角;讓系統中對象的創建、組合和表達方式與系統本身獨立開來。
4、設計模式舉例
篇幅所限,所以只選取了兩個典型的設計模式來進行講解,分別為Adapter(Structural Pattern) 和Observer(Behavioral Pattern)。
Adapter
遇到的問題:新的系統需要使用舊的不兼容組件,盡量不修改舊的組件。
目標:提供訪問舊組件的入口。
應用場景:假設舊組件LegacyRectangle擁有一個display方法,接收x1、y1、w、h四個參數來展示長方形,但是在新系統中客戶期望輸入x1、y1、x2、y2四個參數來展示長方形。在客戶是上帝的假設下,我們怎樣才能既重用舊組件(減少開發新組件的成本)又滿足客戶的需求呢?
解決方案:在Rectangle(Adapter)中將x1、y1、x2、y2轉換成LegacyRectangle所需的x1、y1、w、h,然后調用LegacyRectangle中的display方法。
Observer
遇到的問題:一個對象經常改變它的狀態,有多個視圖需要展示這個對象的當前狀態。
目標:通過定義一個一對多的依賴,使當某一個對象(Publisher)的狀態改變時,所有它的依賴者們(Subscriber)都將被通知并且自動更新狀態。
應用場景:使用電腦的人都知道,我們可以在很多地方修改同一個文件的名字,比如以下地方(以Mac電腦為例)。
那么大家有沒有思考過,當我們在某一個地方修改名字后,操作系統會做什么?所有地方都會立刻更新成修改后的新名字嗎?跟我們在哪個地方修改名字會有關系嗎?
解決方案:
小 結
生活中模式無處不在,無論你是修橋梁還是種莊稼,代碼里面設計模式也無處不在,因為它們都是經過殘酷的考驗后流傳下來的寶貴經驗,值得借鑒和學習。
學習設計模式和讀書一樣,讀書是為了培養甚至灌輸給我們正確的價值觀,但是有很多時候,卻是讓我們了解,要達到一個所謂正確的價值觀,這條道路有多么漫長,多么崎嶇。
本文作者:黃文博(點融黑幫),現就職于點融網成都團隊移動組,畢業于慕尼黑工業大學,主修計算機科學與技術。曾就職于騰訊北京、西門子慕尼黑總部,并曾兩度創業。