溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

常用軟件開發(fā)設(shè)計(jì)模式有哪些

發(fā)布時(shí)間:2022-01-15 16:22:26 來(lái)源:億速云 閱讀:108 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“常用軟件開發(fā)設(shè)計(jì)模式有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“常用軟件開發(fā)設(shè)計(jì)模式有哪些”文章能幫助大家解決問(wèn)題。

分層模式

分層模式可能是最著名的軟件體系結(jié)構(gòu)模式之一。許多開發(fā)人員在不知道名稱的情況下使用它。我們的想法是將您的代碼拆分為“層”,其中每個(gè)層都有一定的責(zé)任,并為更高層提供服務(wù)。

沒(méi)有預(yù)定義數(shù)量的圖層,但這些圖層是您經(jīng)常看到的圖層:

  • Presentation(展示或UI層)

  • Application(應(yīng)用層)

  • Business(業(yè)務(wù)或管理層)

  • Persistence(持久性或數(shù)據(jù)訪問(wèn)層)

  • Database(數(shù)據(jù)庫(kù)層)

這個(gè)想法是,用戶通過(guò)執(zhí)行一些操作(例如點(diǎn)擊一個(gè)按鈕)來(lái)啟動(dòng)表示層中的一段代碼。表示層然后調(diào)用底層,即應(yīng)用層。然后我們進(jìn)入業(yè)務(wù)層,最后,持久層將所有內(nèi)容存儲(chǔ)在數(shù)據(jù)庫(kù)中。所以更高層依賴于并且調(diào)用較低層。

根據(jù)應(yīng)用程序的復(fù)雜程度,您將看到相應(yīng)的變體。一些應(yīng)用程序可能會(huì)忽略應(yīng)用程序?qū)?,而其他?yīng)用程序則會(huì)添加一個(gè)緩存層。甚至可以將兩個(gè)層合并為一個(gè)。例如,ActiveRecord模式結(jié)合了業(yè)務(wù)層和持久層。

每層責(zé)任

如前所述,每一層都有自己的責(zé)任。表示層包含應(yīng)用程序的圖形設(shè)計(jì),以及處理用戶交互的任何代碼。您不應(yīng)該在此圖層中添加不特定于用戶界面的邏輯。

業(yè)務(wù)層是您將模型和邏輯特定于您要解決的業(yè)務(wù)問(wèn)題的地方。

應(yīng)用程序?qū)游挥诒硎緦雍蜆I(yè)務(wù)層之間。一方面,它提供了一種抽象,以便表示層不需要知道業(yè)務(wù)層。理論上,您可以更改表示層的技術(shù)堆棧,而無(wú)需更改應(yīng)用程序中的任何其他內(nèi)容(例如,從WinForms更改為WPF)。另一方面,應(yīng)用程序?qū)犹峁┝朔胖貌贿m合業(yè)務(wù)或表示層的某些協(xié)調(diào)邏輯的位置。

最后,持久層包含訪問(wèn)數(shù)據(jù)庫(kù)層的代碼。數(shù)據(jù)庫(kù)層是底層數(shù)據(jù)庫(kù)技術(shù)(例如SQL Server,MongoDB)。持久層是操縱數(shù)據(jù)庫(kù)的代碼集合:SQL語(yǔ)句,連接細(xì)節(jié)等。

優(yōu)點(diǎn)

  • 大多數(shù)開發(fā)人員都熟悉這種模式。

  • 它提供了一種編寫組織良好,可測(cè)試的應(yīng)用程序的簡(jiǎn)單方法。

缺點(diǎn)

  1. 它往往會(huì)導(dǎo)致單片應(yīng)用程序之后很難分開。

  2. 開發(fā)人員經(jīng)常發(fā)現(xiàn)自己編寫了很多代碼來(lái)通過(guò)不同的圖層,而沒(méi)有在這些圖層中添加任何值。如果你所做的只是編寫一個(gè)簡(jiǎn)單的CRUD應(yīng)用程序,那么分層模式可能對(duì)你來(lái)說(shuō)太過(guò)分了。

適合場(chǎng)景

  • 標(biāo)準(zhǔn)業(yè)務(wù)線應(yīng)用程序,不僅僅是CRUD(寫讀改刪)操作

微內(nèi)核

當(dāng)您的應(yīng)用程序具有一組核心職責(zé)和一組可互換部分時(shí),微內(nèi)核模式或插件模式非常有用。微內(nèi)核將提供應(yīng)用程序的入口點(diǎn)和一般流程,而不知道不同的插件正在做什么。

一個(gè)例子是任務(wù)調(diào)度器。微內(nèi)核可以包含用于調(diào)度和觸發(fā)任務(wù)的所有邏輯,而插件包含特定任務(wù)。只要插件遵循預(yù)定義的API,微內(nèi)核就可以觸發(fā)它們,而無(wú)需了解實(shí)現(xiàn)細(xì)節(jié)。

另一個(gè)例子是工作流程。工作流的實(shí)現(xiàn)包含諸如不同步驟的順序,評(píng)估步驟結(jié)果,決定下一步是什么等概念。步驟的具體實(shí)現(xiàn)對(duì)于工作流的核心代碼來(lái)說(shuō)并不重要。

優(yōu)點(diǎn)

  • 這種模式提供了很大的靈活性和可擴(kuò)展性。

  • 某些實(shí)現(xiàn)允許在應(yīng)用程序運(yùn)行時(shí)添加插件。

  • 微內(nèi)核和插件可以由獨(dú)立的團(tuán)隊(duì)開發(fā)。

缺點(diǎn)

  • 決定什么屬于微內(nèi)核,哪些不屬于微內(nèi)核是很困難的。

  • 預(yù)定義的API可能不適合未來(lái)的插件。

適合場(chǎng)景

  • 從不同來(lái)源獲取數(shù)據(jù)的應(yīng)用程序,轉(zhuǎn)換該數(shù)據(jù)并將其寫入不同的目標(biāo)

  • 工作流應(yīng)用程序

  • 任務(wù)和作業(yè)調(diào)度應(yīng)用程序

CQRS

CQRS是命令和查詢責(zé)任分離(Command and Query Responsibility Segregation)的首字母縮略詞。這種模式的核心概念是應(yīng)用程序具有必須完全分離的讀取操作和寫入操作。這也意味著用于寫操作(命令)的模型將與讀模型(查詢)不同。此外,數(shù)據(jù)將存儲(chǔ)在不同的位置。在關(guān)系數(shù)據(jù)庫(kù)中,這意味著將有用于命令模型的表格和用于讀取模型的表格。一些實(shí)現(xiàn)甚至將不同模型存儲(chǔ)在完全不同的數(shù)據(jù)庫(kù)中,例如命令模型的SQL Server和讀取模型的MongoDB。

這種模式通常與事件采購(gòu)相結(jié)合,我們將在下面介紹。

它是如何工作的?當(dāng)用戶執(zhí)行操作時(shí),應(yīng)用程序會(huì)向命令服務(wù)發(fā)送命令。命令服務(wù)從命令數(shù)據(jù)庫(kù)中檢索它需要的所有數(shù)據(jù),進(jìn)行必要的操作并將其存儲(chǔ)回?cái)?shù)據(jù)庫(kù)中。然后它通知讀取服務(wù),以便可以更新讀取模型。這個(gè)流程如下所示。

常用軟件開發(fā)設(shè)計(jì)模式有哪些

當(dāng)應(yīng)用程序需要向用戶顯示數(shù)據(jù)時(shí),它可以通過(guò)調(diào)用讀取服務(wù)來(lái)檢索讀取的模型,如下所示。

常用軟件開發(fā)設(shè)計(jì)模式有哪些

優(yōu)點(diǎn)

  • 命令模型可以專注于業(yè)務(wù)邏輯和驗(yàn)證,而讀取模型可以針對(duì)特定場(chǎng)景量身定制。

  • 您可以避免復(fù)雜的查詢(例如,SQL中的連接),這使得讀取更加高效。

缺點(diǎn)

  • 保持命令和讀取模型同步可能會(huì)變得復(fù)雜。

適合場(chǎng)景

  • 期望大量讀取的應(yīng)用程序

  • 復(fù)雜域的應(yīng)用程序

事件采購(gòu)

正如我上面提到的,CQRS通常與事件采購(gòu)密切相關(guān)。這是一種模式,它不會(huì)將模型的當(dāng)前狀態(tài)存儲(chǔ)在數(shù)據(jù)庫(kù)中,而是存儲(chǔ)模型中發(fā)生的事件。因此,當(dāng)客戶名稱發(fā)生變化時(shí),您不會(huì)將該值存儲(chǔ)在“名稱”列中。你將存儲(chǔ)一個(gè)帶有新值的“NameChanged”事件(也可能是舊的)。

當(dāng)您需要檢索模型時(shí),您將檢索其存儲(chǔ)的所有事件并在新對(duì)象上重新應(yīng)用它們。我們稱之為補(bǔ)水對(duì)象。

事件采購(gòu)的現(xiàn)實(shí)類比是會(huì)計(jì)。當(dāng)您添加費(fèi)用時(shí),您不會(huì)更改總額的值。在會(huì)計(jì)中,會(huì)添加一條新行,并執(zhí)行操作。如果發(fā)生錯(cuò)誤,只需添加一個(gè)新行。為了讓您的生活更輕松,您可以在每次添加線路時(shí)計(jì)算總計(jì)。這個(gè)總數(shù)可以看作是讀取模型。下面的例子應(yīng)該更清楚。

您可以看到我們?cè)谔砑影l(fā)票201805時(shí)發(fā)生了錯(cuò)誤。我們添加了兩條新線,而不是更改線:首先,一條線用于取消錯(cuò)誤線,然后是一條新的正確線。這就是事件采購(gòu)的工作方式。你永遠(yuǎn)不會(huì)刪除事件,因?yàn)樗鼈冊(cè)谶^(guò)去不可否認(rèn)。為了糾正情況,我們添加了新事件。

另外,請(qǐng)注意我們?nèi)绾螕碛锌傊档膯卧?。這只是上面單元格中所有值的總和。在Excel中,它會(huì)自動(dòng)更新,因此您可以說(shuō)它與其他單元格同步。它是閱讀模型,為用戶提供了一個(gè)簡(jiǎn)單的視圖。

事件采購(gòu)?fù)ǔEcCQRS結(jié)合使用,因?yàn)橹匦滤瘜?duì)象可能會(huì)對(duì)性能產(chǎn)生影響,特別是當(dāng)實(shí)例有很多事件時(shí)??焖匍喿x模式可以顯著提高應(yīng)用程序的響應(yīng)時(shí)間。

優(yōu)點(diǎn)

  • 該軟件體系結(jié)構(gòu)模式可以提供開箱即用的審計(jì)日志。每個(gè)事件表示在某個(gè)時(shí)間點(diǎn)對(duì)數(shù)據(jù)的操縱。

缺點(diǎn)

  • 它需要一些紀(jì)律,因?yàn)槟悴荒苡脭?shù)據(jù)庫(kù)中的簡(jiǎn)單編輯修正錯(cuò)誤的數(shù)據(jù)。

  • 改變事件結(jié)構(gòu)并不是一件容易的事情。例如,如果添加屬性,則數(shù)據(jù)庫(kù)仍包含沒(méi)有該數(shù)據(jù)的事件。您的代碼需要慷慨地處理這些缺失的數(shù)據(jù)。

適合場(chǎng)景

  • 需要將事件發(fā)布到外部系統(tǒng)

  • 將用CQRS構(gòu)建

  • 需要對(duì)數(shù)據(jù)進(jìn)行更改的審計(jì)日志

微服務(wù)

當(dāng)您將應(yīng)用程序編寫為一組微型服務(wù)時(shí),實(shí)際上是在編寫可以一起工作的多個(gè)應(yīng)用程序。每個(gè)微服務(wù)都有自己獨(dú)特的責(zé)任,團(tuán)隊(duì)可以獨(dú)立于其他微服務(wù)開發(fā)它們。他們之間唯一的依賴是溝通。由于微服務(wù)彼此通信,因此您必須確保它們之間發(fā)送的消息保持向后兼容。這需要一些協(xié)調(diào),特別是當(dāng)不同的團(tuán)隊(duì)負(fù)責(zé)不同的微服務(wù)時(shí)。

一張圖可以解釋。

常用軟件開發(fā)設(shè)計(jì)模式有哪些

在上圖中,應(yīng)用程序調(diào)用一個(gè)中央API,將呼叫轉(zhuǎn)發(fā)到正確的微服務(wù)。在本例中,用戶配置文件,庫(kù)存,訂單和付款有單獨(dú)的服務(wù)。你可以想象這是一個(gè)應(yīng)用程序,用戶可以訂購(gòu)一些東西。單獨(dú)的微服務(wù)也可以互相調(diào)用。例如,支付服務(wù)可以在支付成功時(shí)通知訂單服務(wù)。訂單服務(wù)可以調(diào)用庫(kù)存服務(wù)來(lái)調(diào)整庫(kù)存。

目前還沒(méi)有明確規(guī)定微服務(wù)的規(guī)模。在前面的示例中,用戶配置文件服務(wù)可能負(fù)責(zé)數(shù)據(jù),如用戶的用戶名和密碼,還包括家庭地址,頭像圖片,收藏夾等。還可以將所有這些責(zé)任分成更小的一個(gè)選項(xiàng)微服務(wù)。

優(yōu)點(diǎn)

  • 您可以分別編寫,維護(hù)和部署每個(gè)微服務(wù)。

  • 微服務(wù)架構(gòu)應(yīng)該更容易擴(kuò)展,因?yàn)槟荒軘U(kuò)展需要擴(kuò)展的微服務(wù)。沒(méi)有必要擴(kuò)展應(yīng)用程序中不常使用的部分。

  • 重寫應(yīng)用程序的部分更容易,因?yàn)樗鼈兏〔⑶遗c其他部分的耦合更少。

缺點(diǎn)

  • 與您所期望的相反,開始編寫結(jié)構(gòu)良好的巨集實(shí)際上更容易,稍后將其分解為微服務(wù)。隨著微服務(wù)的出現(xiàn),許多額外的問(wèn)題開始發(fā)揮作用:溝通,協(xié)調(diào),向后兼容性,日志記錄等等。錯(cuò)過(guò)編寫結(jié)構(gòu)良好的巨集的必要技能的團(tuán)隊(duì)可能很難寫出一套很好的微服務(wù)。

  • 用戶的單個(gè)動(dòng)作可以通過(guò)多個(gè)微服務(wù)。還有更多的失敗點(diǎn),當(dāng)出現(xiàn)問(wèn)題時(shí),可能需要更多時(shí)間來(lái)查明問(wèn)題。

適合:

  • 應(yīng)用程序某些部分將被密集使用并需要縮放

  • 為其他幾個(gè)應(yīng)用程序提供功能的服務(wù)

  • 如果組合成一個(gè)整體,那么應(yīng)用程序?qū)⒆兊梅浅?fù)雜

  • 應(yīng)用程序可以定義明確的有界上下文

關(guān)于“常用軟件開發(fā)設(shè)計(jì)模式有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI