AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

必知必會的22種設計模式(GO語言)

來源: 責編: 時間:2023-10-13 14:34:43 240觀看
導讀日常工作中免不了使用設計模式,那么你使用了哪些設計模式呢?設計模式是什么?設計模式是一種在軟件設計中對常見問題的通用解決方案。它們是經過驗證的、可重用的設計思想,可以幫助解決開發過程中遇到的各種問題。設計模式

日常工作中免不了使用設計模式,那么你使用了哪些設計模式呢?CJV28資訊網——每日最新資訊28at.com

設計模式是什么?

設計模式是一種在軟件設計中對常見問題的通用解決方案。CJV28資訊網——每日最新資訊28at.com

它們是經過驗證的、可重用的設計思想,可以幫助解決開發過程中遇到的各種問題。CJV28資訊網——每日最新資訊28at.com

設計模式提供了一種共同的詞匯表和方法論,讓不同團隊的開發人員能夠更有效地溝通和協作,從而提高軟件的穩定性、可靠性和可維護性。CJV28資訊網——每日最新資訊28at.com

整體來看,設計模式包含了如下 22 種,主要分為三大類CJV28資訊網——每日最新資訊28at.com

  1. 創造型
  2. 結構型
  3. 行為型

圖片圖片CJV28資訊網——每日最新資訊28at.com

看上去很多種,實際上咱們實際仔細去看每種模式的思想和細節的時候,能夠發現其實我們日常工作中有用到,只是不知道原來是應用了設計模式CJV28資訊網——每日最新資訊28at.com

有道無術術可求,有術無道止于術 ,那么先來學習學習每種設計模式的思想,以及 GO 語言實現的 demoCJV28資訊網——每日最新資訊28at.com

創建型模式

1.  工廠模式

工廠模式 解決了在不指定具體類的情況下創建產品對象的問題CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

寫一個工廠,可以生產車,目前這個工廠可以生產 bmw 和 benz ,那么我們需要獲取一輛車的時候,就直接去車廠拿車即可CJV28資訊網——每日最新資訊28at.com

  • demo 1

2.  抽象工廠模式

它能創建一系列相關的對象, 而無需指定其具體類CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

一個大賣場,有衣服,有 鞋子,有 NB 品牌,有 Nike 品牌,此時我們就可以使用抽象工廠,抽象衣服,鞋子,每一個品牌自行去實現具體的衣服和鞋子CJV28資訊網——每日最新資訊28at.com

  • demo 2

3.  生成器模式

能夠分步驟創建復雜對象CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

建一座建筑,無論你是冰室,還是住房,是非常復雜的,我們演示簡化為 4 個步驟,每個步驟都會創建新的對象,大體會經歷如下步驟CJV28資訊網——每日最新資訊28at.com

  • 搭建框架
  • 裝修
  • 安裝門
  • 安裝床
  • demo 3

4.  原型模式

能夠復制已有對象, 而又無需使代碼依賴它們所屬的類CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

此時可以想到我們的程序目錄,和目錄下的文件,是否可以通過這種方式實現呢?CJV28資訊網——每日最新資訊28at.com

程序的目錄和文件,能夠滿足遞歸的結構,目錄和文件,都是同樣的結構CJV28資訊網——每日最新資訊28at.com

  • demo 4

5.  單例模式

能夠保證一個類只有一個實例, 并提供一個訪問該實例的全局節點CJV28資訊網——每日最新資訊28at.com

單例實例會在結構體首次初始化時創建,若多個協程創建,如何保證協程安全呢?CJV28資訊網——每日最新資訊28at.com

package mainimport (   "fmt"   "sync")var lock sync.Mutexvar one sync.Oncetype Single struct {}// 此時創建的  SingleInstance 默認為 零值, 也就是 nilvar SingleInstance *Single// getOneInstance 顯示使用 鎖的方式,保證線程安全func getOneInstance() *Single {   if SingleInstance == nil {      // 此處可能會有多個協程進來      lock.Lock()      defer lock.Unlock()      // 此處再繼續 判斷 SingleInstance 是否為 nil,是因為可能其他協程已經拿到鎖,且初始化好了 SingleInstance 后,當前協程才拿到鎖      if SingleInstance == nil {         fmt.Println("getOneInstance: Create SingleInstance successfully ...")         SingleInstance = &Single{}      } else {         fmt.Println("1 getOneInstance: SingleInstance has been created ...")      }   }else {      fmt.Println("2 getOneInstance: SingleInstance has been created ...")   }   return SingleInstance}// getTwoInstance 使用 sync.Once 達到同樣的效果func getTwoInstance() *Single {   if SingleInstance == nil {      fmt.Println("getTwoInstance: in SingleInstance == nil ...")      one.Do(func() {         // 因此 one.Do 只會執行一次,因此不會出現  getOneInstance 的情況,因此此處無需判斷 SingleInstance 是否為 nil         fmt.Println("getTwoInstance: Create SingleInstance successfully ...")         SingleInstance = &Single{}      })   } else {      fmt.Println("getTwoInstance: SingleInstance has been created ...")   }   return SingleInstance}func main() {   for i := 0; i < 20; i++ {      //getOneInstance()      getTwoInstance()   }   fmt.Scanln()// 輸出回車就會結束}
5_single_instance>go run main.gogetTwoInstance: in SingleInstance == nil ...getTwoInstance: Create SingleInstance successfully ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...getTwoInstance: SingleInstance has been created ...
  • demo 5

結構型模式

6.  適配器模式

讓接口不兼容的對象能夠相互合作CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

可能我們都用過生活中的適配器吧,我們手機是 Type C 的接口,電腦是 USB 的接口,那么這個時候,如何讓 TypeC 的接口和 USB 的接口連接上呢?這個時候就可以使用適配器來處理CJV28資訊網——每日最新資訊28at.com

  • demo 6

7.  橋接模式

可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構, 從而能在開發時分別使用 案例:CJV28資訊網——每日最新資訊28at.com

不同的顯示器要接入計算機,那么計算機可以獨立開發,顯示器也可以獨立開發,無論計算機里面有 windows 的,還是 mac 的 仍然支持設置 顯示器CJV28資訊網——每日最新資訊28at.com

  • demo 7

8.  組合模式

使用它將對象組合成樹狀結構, 并且能像使用獨立對象一樣使用它們CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

咱們的目錄樹中有 目錄,有 文件, 目錄可以進行查詢,文件也是可以進行查詢,將他們組合起來,他們各自仍然是獨立的對象CJV28資訊網——每日最新資訊28at.com

  • demo 8

9.  代理模式

能夠提供對象的替代品或其占位符CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

對于 nginx 反向代理很熟悉吧,咱們手擼一個簡單的反向代理,運用代理模式CJV28資訊網——每日最新資訊28at.com

  • demo 9

10. 裝飾器模式

允許你通過將對象放入包含行為的特殊封裝對象中來為原對象綁定新的行為CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

年輕人喜歡喝奶茶,不同的口味不同的配置有不同的價格,喝奶茶,有原味的,有加珍珠的,有加椰果的,有加奶的 ,各有各的價格CJV28資訊網——每日最新資訊28at.com

那么 奶茶 和 珍珠,椰果,奶 是相互獨立的,各自是一個獨立的對象 我們可以在珍珠對象中,放入奶茶對象,進而達到 奶茶中加珍珠,加椰果,加奶 達到不同的價格CJV28資訊網——每日最新資訊28at.com

  • demo 10

11. 外觀模式

能為程序庫、 框架或其他復雜類提供一個簡單的接口CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

咱們去銀行存錢,取錢,表面上看著很簡單,一進一出即可,殊不知銀行后面的內部系統之間復雜的交互,我們簡化一下 例如 銀行后面涉及到 賬戶系統,檢測系統,數據庫系統,通知系統 這個時候 就可以使用 外觀模式,對于客戶端來說使用非常簡單,無需關注其內部復雜系統CJV28資訊網——每日最新資訊28at.com

  • demo 11

12. 享元模式

通過共享多個對象所共有的相同狀態CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

設計一個足球比賽游戲,A 隊隊服是 紅色,B 隊隊服是 藍色,且整個隊伍就只有一個套衣服 ,此處就應用了享元模式CJV28資訊網——每日最新資訊28at.com

如果不應用享元模式,那么我們每一個人都要 new 一套衣服,咱確實沒有必要這樣做CJV28資訊網——每日最新資訊28at.com

  • demo 12

行為模式

13. 命令模式

將請求轉換為一個包含與請求相關的所有信息的獨立對象CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

咱們以插件的方式來注入到程序中,如 我們平日看電視,需要按按鈕,按鈕上有各種按鍵,例如開機鍵,關機鍵CJV28資訊網——每日最新資訊28at.com

另外,這個按鍵又是對于哪些設備生效呢?此處咱們是對 TV 生效,可以使用命令模式,很好的插入這些相關對象CJV28資訊網——每日最新資訊28at.com

  • demo 13

14. 策略模式

讓你定義一系列算法, 并將每種算法分別放入獨立的類中, 以使算法的對象能夠相互替換CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

咱們知道緩存的處理方式,有 FIFO,LFU,LRU, 那么當我們將數據載入緩存的時候,使用的算法進行切換了,我們仍然需要這個緩存是可以正常處理的,這個時候,咱們就可以使用策略模式CJV28資訊網——每日最新資訊28at.com

又如我們需要取到一個目的地,我們可以坐飛機,可以乘高鐵,也可以走路去,在過程中仍然可以隨意切換交通方式,最終,我們都是抵達目的地,沒有問題,同樣也可以使用策略模式CJV28資訊網——每日最新資訊28at.com

  • demo 14

15. 模板模式

在超類中定義一個算法的框架, 允許子類在不修改結構的情況下重寫算法的特定步驟CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

模板的方式,相信我們平日用的也非常多,舉個例子我們就能夠很好的感受到CJV28資訊網——每日最新資訊28at.com

我們要獲取消息,保存消息到緩存,生成消息回復,發送消息,這幾個步驟不變的情況下,我們可以使用 微信,可以使用企業微信,自然也是可以使用飛書來處理CJV28資訊網——每日最新資訊28at.com

我們生成 源 msg,期望放到緩存中,生成具體的回復信息,將消息發送出去 對于這種步驟固定,但是對于每一步驟期望有自己的實現方式的,期望去重寫具體的實現方式的,可以使用模板方法CJV28資訊網——每日最新資訊28at.com

獲取到信息之后,wechat ,wework,lark 有不同的處理方式,但是他們的整體處理結構是一樣的CJV28資訊網——每日最新資訊28at.com

  • demo 15

16. 迭代器模式

讓你能在不暴露集合底層表現形式 (列表、 棧和樹等) 的情況下遍歷集合中所有的元素CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

我們提供出去的接口,不期望別人能看到我們自身的數據結構,我們就可以使用迭代器的方式來進行處理,可以隱藏實際的數據結構CJV28資訊網——每日最新資訊28at.com

  • demo 16

17. 觀察者模式

允許你定義一種訂閱機制, 可在對象事件發生時通知多個 “觀察” 該對象的其他對象CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

這種設計模式應用很多,我們舉例一個食堂吃飯的例子CJV28資訊網——每日最新資訊28at.com

多個員工觀察食堂,食堂做好菜之后 訂閱的員工都能夠收到通知,員工便傾巢而出CJV28資訊網——每日最新資訊28at.com

  • demo 17

18. 責任鏈模式

允許你將請求沿著處理者鏈進行發送。 收到請求后, 每個處理者均可對請求進行處理, 或將其傳遞給鏈上的下個處理者CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

例如處理一件事情,有一個固定的流程,正如一個新員工入職CJV28資訊網——每日最新資訊28at.com

員工入職可以看做是一個責任鏈, 前臺報道,人事制度宣講,合同部合同簽訂,送入具體部門 , 這種部門職責明確,鏈路清晰,可以使用 責任鏈模式,允許你將請求沿著處理者鏈進行發送 對于新員工來說,只需要知道去去找前臺報道即可CJV28資訊網——每日最新資訊28at.com

  • demo 18

19. 備忘錄模式

允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。CJV28資訊網——每日最新資訊28at.com

案例: 例如某白領使用備忘錄,記錄了 1 ,2 ,3 條信息,然后想調出 2 快照來進行查看CJV28資訊網——每日最新資訊28at.com

  • demo 19

20. 中介者模式

能讓你減少對象之間混亂無序的依賴關系。 該模式會限制對象之間的直接交互, 迫使它們通過一個中介者對象進行合作。CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

醫院里面有很多不同職業的人來看病,如何保證用戶進入醫生辦公室發生沖突呢?CJV28資訊網——每日最新資訊28at.com

這個時候就有一個醫院服務人員來進行管理,負責和不同的職業的病人溝通, 雖然病人之間沒有溝通,但是他們依然能有有序的進入到醫生辦公室內看病,此時醫院服務人員就是一個中介者CJV28資訊網——每日最新資訊28at.com

  • demo 20

21. 狀態模式

讓你能在一個對象的內部狀態變化時改變其行為, 使其看上去就像改變了自身所屬的類一樣CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

售賣機暫時只售賣一種從產品,有 4 種狀態,沒貨,有貨,正在請求商品,已投幣CJV28資訊網——每日最新資訊28at.com

對于不同的狀態,應對不同的動作CJV28資訊網——每日最新資訊28at.com

  • demo 21

22. 訪問者模式

將算法與其所作用的對象隔離開來CJV28資訊網——每日最新資訊28at.com

案例:CJV28資訊網——每日最新資訊28at.com

目前有 3 種結構, Dog,Cat,Monkey 都實現了 IAnimal interface,訪問者有 AreaVs(計算面積),VolumeVs(計算體積),ColorVs (計算顏色) 都實現了 IVisitor interfaceCJV28資訊網——每日最新資訊28at.com

以后如果需要類似于增加計算體脂率的,那么就可以加一個 visitor 即可,且對其他的訪問者和結構沒有影響CJV28資訊網——每日最新資訊28at.com

如果需要增加結構,例如增加 pig ,那么直接去實現 Animal 即可,對其他的結構和訪問者沒有影響CJV28資訊網——每日最新資訊28at.com

有沒有覺得很巧妙呢?CJV28資訊網——每日最新資訊28at.com

  • demo 22

本文鏈接:http://www.tebozhan.com/showinfo-26-13498-0.html必知必會的22種設計模式(GO語言)

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 并發樂觀鎖CAS原理,吊打問并發的面試官

下一篇: SpringBoot如何實現熱部署?

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 滴滴違法違規被罰80.26億 共存在16項違法事實

    滴滴違法違規被罰80.26億 存在16項違法事實開始于2121年7月,歷經一年時間,網絡安全審查辦公室對“滴滴出行”網絡安全審查終于有了一個暫時的結束。據“網信
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top