設計模式的定義和分類

来源:https://www.cnblogs.com/mingqi-420/archive/2019/05/03/10806379.html
-Advertisement-
Play Games

1、設計模式的定義和分類 設計迷失的出現可以讓開發人員站在前人的肩膀上,通過一些成熟的設計方案來指導新項目的設計和開發沒以便於開發出具有更好的靈活性和可拓展性。也更易於復用的軟體系統, 設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼,讓代碼 ...


1、設計模式的定義和分類

設計迷失的出現可以讓開發人員站在前人的肩膀上,通過一些成熟的設計方案來指導新項目的設計和開發沒以便於開發出具有更好的靈活性和可拓展性。也更易於復用的軟體系統,

設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼,讓代碼更容易被他人理解並且提高代碼的可靠性。設計模式是一種用於對系統中不斷重現的設計問題的解決方案進行文本化的技術,也是一種共用專家設計經驗的技術。

GoF對設計模式的定義如下:

設計模式 是指在特定環境下為解決某一通用軟體設計問題提供的一套定製的解決方案,該解決方案描述了對象和類之間的相互作用

2、設計模式的基本要素

(1)模式名稱

模式名稱通過一兩個關鍵詞來描述模式的問題、解決方案和效果,以便用戶更好地理解設計模式並便於開發人員之間的交流。絕大多數數模式都是跟據其功能或者模式結構來命名的,在學習設計模式時候,首先應該準確的記憶該設計模式的中引文模式名,在已有的類庫中,很多使用了設計模式的類名通常包含了使用的設計模式的名稱,如果一個類名稱為XXXAdapter,則該類是一個適配器類,在設計時使用了適配器模式,如果一個類名稱為XXXFactory,則該類是一個工廠類,一定包含了 一個工廠方法用於返回一個類的實例對象。

(2)問題

問題描述了應該在什麼時候使用設計模式,包含了原始設計中存在的問題以及問題存在的原因。這些問題有些事特定的設計問題,如怎樣使用對象封裝狀態或者使用對象標識演算法等,也可能是系統中存在不靈活的類或對象結構導致系統的可維護性較差,有時候,在模式的問題藐視部分可能會包含使用該設計模式時必須滿足的一系列先決條件,如在使用橋接模式時系統中的類必須存在兩個獨立變化的維度,在使用組合模式的時候系統中必須存在整體和部分的層次結構等。在對問題進行描述的同時實際上確定了模式所對應的使用環境以及模式的使用動機

(3)解決方案

解決方案描述了設計模式的組成成分,以及這些組成成分之間的相互關係,各自的職責和協作方式,模式時一個通用的模板,它可以應用於各種不同的場合。解決方案並不描述一個特定而具體的設計或者實現,而是提供設計問題的抽象描述和怎樣使用一個具有一般意義的元素組合(類或者對象做組合)來解決這個問題。在學習設計模式的時候,解決方案通過類圖和核心代碼來加以說明,對於每個設計模式,必須掌握其類圖,理解類圖中每一個角色的意義以及他們之間的關係。並且需要掌握實現該設計模式的一些核心代碼,以便於在實際卡發中合理使用設計模式。

(4)效果

效果描述了設計模式的應用情況以及在使用設計模式時應該權衡的問題。效果主要包含設計模式的優缺點分析。大家必須知道,沒有任何一個解決方案是100%完美的,在使用設計模式的時候需要進行合理的評價和選擇。一個設計模式在某方面具有優點的同時可能在另一方面存在缺陷,因此需要綜合考慮模式的效果。在評價效果的時候,通過結合面向對象設計原則來進行分析(以後有時間整理出筆記來),如判斷一個模式是否符合單一職責原則、是否符合開閉原則等

除了以上四個基本要素外,完整的設計模式描述中通常還包含該模式的別名(其他名稱),模式的分類(模式所屬的類別)、模式的適用性(在什麼情況下可以使用該設計模式)、模式的角色(即模式的參與者,模式中的類和對象以及他們之間的職責)、模式實例(通過實例來進一步加深對模式的理解)、模式的應用(在已有系統中該模式的使用)、模式的拓展(該模式的一些改進、與之相關的其他模式以及其他擴展知識)等。

3、設計模式的分類

(1)根據目的分類

① 創建型模型(Creational)

此類模式主要用於創建對象,GoF提供了5種創建模型,分別是工廠方法模式(Factory Method Pattern)、抽象工廠模式(Abstract Factory Pattern)、建造者模式(Builder Pattern)、原型模式(Prototype Pattern)和單例模式(Singleton Pattern)。

② 結構性模式 (Structural)

此類設計模式主要用於處理類和對象的組合。GoF提供了7種結構型模型,分別是適配器模式(Adapter Pattern)、橋接模式(Bridge Pattern)、組合模式(Conposite Pattern)、裝飾模式(Decorator Pattern)、外觀模式(Facade Pattern)、享元模式(Flyweight Pattern)和代理模式(Proxy Pattern)。

③行為模型模式(Behavioral)

此類設計模式主要用於描述類或者對象如何 交互和怎樣分配職責,GoF提供了11種行為型模型。分別是職責鏈模式(Chain of Responsibility Pattern)、命令模式(Command

Pattern)、解釋器模式(Interpreter Pattern)、迭代器模式(Iterator Pattern)、中介者模式(Mediator Pattern)、備忘錄模式(Memento Pattern)、觀察者模式(Observer Pattern)、狀態模式(State Pattern)。策略模式(Strategy Pattern)。模板方法模式(Template Method Pattern)和訪問者模式(Visitor Pattern).

GoF(“四人幫”,指Gamma, Helm, Johnson & Vlissides, Addison-Wesley四人)提出的23種設計模式可謂經典,由於其定義比較嚴謹趨於理論化,故剛開始不一定很快掌握,下麵簡要對23種設計模式予以簡要介紹,並給出現實中相關的通俗易懂的事例:

4 23種設計模式

Abstract Factory 抽象工廠模式——提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。

Adapter 適配器模式—–將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。

Bridge 橋接模式——將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

Builder 生成器模式——將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

Chain of Responsibility 職責鏈模式——為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。

Command 命令模式——將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操作。

Composite 組合模式——–將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得客戶對單個對象和複合對象的使用具有一致性。

Decorator 裝飾模式——動態地給一個對象添加一些額外的職責。就擴展功能而言,Decorator模式比生成子類方式更為靈活。

Facade 外觀模式——為子系統中的一組介面提供一個一致的界面, Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

Factory Method 工廠方法模式——定義一個用於創建對象的介面,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。

Flyweight 享元模式——運用共用技術有效地支持大量細粒度的對象。

Interpreter 解釋器模式——給定一個語言, 定義它的文法的一種表示,並定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。

Iterator 迭代器模式—–提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。

Mediator 中介者模式——用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。

Memento 備忘模式——在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。這樣以後就可將該對象恢復到保存的狀態。

Observer 觀察者模式:定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。

Prototype 原型模式——用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。

Proxy 代理模式:為其他對象提供一個代理以控制對這個對象的訪問。

Singleton 單態模式——保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

State 狀態模式:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它所屬的類。

Strategy 策略模式——定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得演算法的變化可獨立於使用它的客戶。

Template Method 模板方法模式——定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

Visitor 訪問者模式—–表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

需要註意的是這23中設計模式並不是獨立存在的,很多設計模式之間存在著聯繫,例如在訪問者 模式中操作對象結構中的元素通常需要使用迭代器模式。在解釋器模式中定義終結符表達式和非終結符表達式時候可以使用組合模式,此外,還可以通過組合兩個和多個模式來設計同一個系統,在充分發揮每一個模式優勢的同時使他們可以協同工作,完成一些複雜的設計。

5 設計模式的優點

設計模式是從許多優秀的軟體系統中總結出來的、成功的、能夠實現可維護性的設計方案,開發人員使用這些方案能夠避免做一些重覆的工作,而且可以設計出高質量的軟體系統,具體來說沒設計模式的主要優點如下:

(1)設計模式融合了眾多專家的經驗,並以一種標準的形式供廣大開發人員使用,它提供了一套通用的設計辭彙和一種通用的語言,以方便開發人員之間進行溝通和交流,使得設計方案更加通俗易懂。使不同編程語言的開發和設計人員可以通過設計模式來交流系統設計方案,每一個模式都對應一個標準的解決方案,設計模式可以降低開發人員理解系統的複雜度,

(2)設計模式讓人們可以更加簡單方便的復用成功的設計和體繫結構,將已經證實的技術表述成設計模式也可以使新系統的開發者更加容易理解其設計思路。設計模式使得重用成功的設計更加容易,並避免導致不可重用的設計方案。

(3)設計模式使得設計方案更加靈活,且易於修改,在很多設計模式中廣泛使用了開閉原則、依賴倒轉原則、迪米特法則等面向對象設計原則,使得系統具有較好的可維護性,真正實現了可維護性的復用,在軟體開發中合理只用設計模式,可使系統中的一些組成部分在其他系統中得以重用,而在此基礎上進行二次開發很方便。正因為設計模式具有該有點,因此在.NET Framework SDK、NHibernate 、NUnit等類庫和框架的設計中大量使用了設計模式。

(4)設計模式的使用將提高軟體系統的開發效率和軟體質量,且在一定程度上節約設計成本,設計模式時一些通過多次實踐得以證明的行之有效的解決方案,這些解決方案通常是針對某一類問題的最佳設計方案,因此,可以幫助設計人員構造優秀的軟體系統,並且可以直接重用這些設計經驗,節省系統設計成本。

(5)設計模式有助於初學者更深入的理解面向對象思想,一方面可以幫助初學者更加方便的閱讀和學習現有類庫與其他系統中的源代碼,另一方面可以提高軟體設計水平和代碼質量。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Date Math String Object ...
  • onclick單機事件 ondblick雙擊事件 onfocus成為焦點,onblur失去焦點 onchange選中對象的值發生變化 onload頁面裝載 onmousemove滑鼠移動 onmouseeout 出去 onmousewheel滑動滾輪 onkeydown按鍵盤 ...
  • 函數 一、創建函數 1.function 函數名( 形參列表 ){ 函數體 } 2.var 函數名 = function( 形參列表 ) { 函數體 } 3.var 函數名 = new Function("形參1","形參2",...,"形參N","函數體" ) 二、函數的屬性 1.length 形 ...
  • 說起ajax,就不得不說他背後的核心對象XMLHttpRequest,而說到XMLHttpRequest我覺得,從它的readyState狀態說起是最好的切入點。 個人覺得,只要弄清楚了readyState的這幾個狀態,其實ajax的原理也就算弄清楚了。為了更方便您理解,筆者特意畫了一張狀... ...
  • 最短編輯距離 js function levenshteinDistance(a,b){ //生成表 const distanceMatix = Array(a.length + 1).fill(null).map(() = Array(b.length + 1).fill(null)) //第一行 ...
  • 首先要清楚IndexOf的使用方法 indexOf() 方法可返回某個指定的字元串值在字元串中首次出現的位置。 語法 stringObject.indexOf(searchvalue,fromindex) 參數 searchvalue 必需,規定需檢索的字元串值。 fromindex 可選的整數參數 ...
  • 1 2 3 4 5 Title 6 16 17 18 版本號: 19 20 ...
  • 不管是作為後端還是前端開發人員,對於web請求的過程和參數都是需要瞭解的。 下麵是對一次簡單的http請求的header分析,作為自己的一個總結,也希望對大家有所幫助。 以Chrome為例: 我們對header的參數挨個分析 General Request URL: http://localhost ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...