文章目錄
- 1、是什麼
- 2、怎麼做
- 3、有哪些
1、是什麼
俗話說:站在别人的肩膀上,我們會看得更遠。設計模式的出現可以讓我們站在前人的肩膀上,通過一些成熟的設計方案來指導新項目的開發和設計,以便于我們開發出具有更好的靈活性和可擴充性,也更易于複用的軟體系統。
設計模式的一般定義如下:
設計模式(DesignPattern)是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人了解并且保證代碼可靠性。
狹義的設計模式是指GoF在《設計模式:可複用面向對象軟體的基礎》一書中所介紹的23種經典設計模式,不過設計模式并不僅僅隻有這23種,随着軟體開發技術的發展,越來越多的新模式不斷誕生并得以應用。
設計模式一般包含模式名稱、問題、目的、解決方案、效果等組成要素,其中關鍵要素是模式名稱、問題、解決方案和效果。
模式名稱(Pattern Name)通過一兩個詞來描述模式的問題、解決方案和效果,以便更好地了解模式并友善開發人員之間的交流,絕大多數模式都是根據其功能或模式結構來命名的;
問題(Problem)描述了應該在何時使用模式,它包含了設計中存在的問題以及問題存在的原因;
解決方案(Solution)描述了一個設計模式的組成成分,以及這些組成成分之間的互相關系,各自的職責和協作方式,通常解決方案通過UML類圖和核心代碼來進行描述;
效果(Consequences)描述了模式的優缺點以及在使用模式時應權衡的問題。
2、怎麼做
作為設計模式的忠實粉絲和推廣人員,在正式學習設計模式之前,我結合多年的工作經驗和學習心得,這裡給出了下列個人的建議:
- 掌握設計模式并不是件很難的事情,關鍵在于多思考,多實踐,不要聽到人家說懂幾個設計模式就很“牛”,隻要用心學習,設計模式也就那麼回事,你也可以很“牛”的,一定要有信心。
- 在學習每一個設計模式時至少應該掌握如下幾點:這個設計模式的意圖是什麼,它要解決一個什麼問題,什麼時候可以使用它;它是如何解決的,掌握它的結構圖,記住它的關鍵代碼;能夠想到至少兩個它的應用執行個體,一個生活中的,一個軟體中的;這個模式的優缺點是什麼,在使用時要注意什麼。當你能夠回答上述所有問題時,恭喜你,你了解一個設計模式了,至于掌握它,用多了自然就掌握了。
- “如果想體驗一下運用模式的感覺,那麼最好的方法就是運用它們”。正如很多書裡所說的,無論學習什麼都要做到知行合一。
- 千萬不要濫用模式,不要試圖在一個系統中用上所有的模式。每個模式都有自己的适用場景,不能為了使用模式而使用模式,濫用模式不如不用模式,因為濫用的結果得不到“藝術品”一樣的軟體,很有可能是一堆垃圾代碼。
- 如果将設計模式比喻成“三十六計”,那麼每一個模式都是一種計策,它為解決某一類問題而誕生,不管這個設計模式的難度如何,使用頻率高不高,我建議大家都應該好好學學,多學一個模式也就意味着你多了“一計”,說不定什麼時候一不小心就用上了,
- 設計模式的“上乘”境界:“手中無模式,心中有模式”。模式使用的最高境界是你已經不知道具體某個設計模式的定義和結構了,但你會靈活自如地選擇一種設計方案【其實就是某個設計模式】來解決某個問題,設計模式已經成為你開發技能的一部分,能夠手到擒來,“内功”與“招式”已渾然一體,要達到這個境界并不是看完某本書或者開發一兩個項目就能夠實作的,它需要不斷沉澱與積累,是以,對模式的學習不要急于求成。
3、有哪些
所屬類型 | 模式名稱 | 模式 | 簡單定義 |
建立模式 | Abstract Factory | 抽象工廠 | 提供用于建立相關對象系列的接口 |
Builder | 生成器 | 使用簡單對象建構複雜對象 | |
Factory Method | 工廠方法 | 将對象的執行個體化延遲到用于建立執行個體的專用函數 | |
row 2 col 2 | 對象池 | 執行個體化并維護一組相同類型的對象執行個體 | |
Singleton | 單例 | 将類型的執行個體化限制為一個對象 | |
結構模式 | Adapter | 擴充卡 | 适配另一個不相容的接口來一起工作 |
Bridge | 橋接 | 将接口與其實作分離,以便兩者可以獨立變化 | |
Composite | 組合 | 封裝并提供對許多不同對象的通路 | |
Decorator | 裝飾 | 靜态或動态地向對象添加行為 | |
Facade | 外觀 | 使用一種類型作為許多其他類型的API | |
Flyweight | 享元 | 運用共享技術有效地支援大量細粒度的對象 | |
Proxy | 代理 | ||
行為模式 | Chain of Responsibility | 職責鍊 | 避免通過提供超過對象處理請求的機會來将發送方與接收方耦合 |
Command | 指令 | 捆綁指令和參數以便稍後調用 | |
Mediator | 中介者 | 連接配接對象并充當代理 | |
Memento | 備忘錄 | 生成可用于傳回先前狀态的不透明令牌 | |
Observer | 觀察者 | 提供回調以通知事件/資料更改 | |
Registry | 注冊 | 跟蹤給定類的所有子類 | |
State | 狀态 | 根據内部狀态封裝同一對象的不同行為 | |
Strategy | 政策 | 允許在運作時選擇算法的行為 | |
Template | 模闆 | 定義一個将某些方法推遲到子類的架構類 | |
Visitor | 通路者 | 将算法與其運作的對象分開 | |
同步模式 | Condition Variable | 條件變量 | 為線程提供一種機制,以暫時放棄通路以等待某些條件 |
Lock/Mutex | 鎖定/互斥 | 對資源實施互斥限制以獲得獨占通路權限 | |
Monitor | 螢幕 | 互斥和條件變量模式的組合 | |
Read-Write Lock | 讀寫鎖定 | 允許并行讀取通路,但僅對資源的寫入操作進行獨占通路 | |
Semaphore | 信号 | 允許控制對公共資源的通路 | |
并行模式 | N-Barrier | N-二道閘 | 阻止程序繼續進行,直到所有N個程序都到達屏障 |
Bounded Parallelism | 有界并行 | 完成大量資源限制的獨立任務 | |
Broadcast | 廣播 | 把一個消息同時傳輸到所有接收端 | |
Coroutines | 協同程式 | 允許在特定地方暫停和繼續執行的子程式 | |
Generators | 生成器 | 一次性生成一系列值 | |
Reactor | 反應 | 服務處理程式使用I/O多路複用政策來同步、有序的處理一個或多個用戶端并發請求 | |
Parallelism | 并行 | 完成大量獨立任務 | |
Producer Consumer | 生産者消費者 | 從任務執行中分離任務 | |
Scheduler | 排程器 | 協調任務步驟 | |
消息傳遞模式 | Fan-In | 扇入 | 該子產品直接調用上級子產品的個數,像漏鬥型一樣去工作 |
Fan-Out | 扇出 | 該子產品直接調用的下級子產品的個數 | |
Futures & Promises | Futures & Promises | 扮演一個占位角色,對未知的結果用于同步 | |
Publish/Subscribe | Publish/Subscribe | 将資訊傳遞給訂閱者 | |
Push & Pull | Push & Pull | 把一個管道上的消息分發給多人 | |
穩定模式 | Bulkheads | Bulkheads | 實施故障遏制原則(即防止級聯故障) |
Circuit-Breaker | 斷路器 | 當請求有可能失敗時,停止流動的請求 | |
Deadline | 截止日期 | 一旦響應變緩,允許用戶端停止一個正在等待的響應 | |
Fail-Fast機制 | 快速失敗 | 檢查請求開始時所需資源的可用性,如果不滿足要求則失敗 | |
Handshaking | 握手 | 詢問元件是否可以承受更多負載,如果不能,則請求被拒絕 | |
Steady-State | 穩定狀态 | 為每一個服務積累一個資源,其它服務必須回收這些資源 | |
剖析模式 | Timing Functions | 時序功能 | 包裝函數并記錄執行 |
成例 | Functional Options | 功能選項 | 允許給預設值建立clean API和慣用重載 |
反模式 | 級聯故障 |