成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
目前有 3 種結構, Dog,Cat,Monkey 都實現了 IAnimal interface,訪問者有 AreaVs(計算面積),VolumeVs(計算體積),ColorVs (計算顏色) 都實現了 IVisitor interface。

日常工作中免不了使用設計模式,那么你使用了哪些設計模式呢?

設計模式是什么?

設計模式是一種在軟件設計中對常見問題的通用解決方案。

它們是經過驗證的、可重用的設計思想,可以幫助解決開發過程中遇到的各種問題。

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

整體來看,設計模式包含了如下 22 種,主要分為三大類

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

圖片圖片

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

有道無術術可求,有術無道止于術 ,那么先來學習學習每種設計模式的思想,以及 GO 語言實現的 demo

創建型模式

1.  工廠模式

工廠模式 解決了在不指定具體類的情況下創建產品對象的問題

案例:

寫一個工廠,可以生產車,目前這個工廠可以生產 bmw 和 benz ,那么我們需要獲取一輛車的時候,就直接去車廠拿車即可

  • demo 1

2.  抽象工廠模式

它能創建一系列相關的對象, 而無需指定其具體類

案例:

一個大賣場,有衣服,有 鞋子,有 NB 品牌,有 Nike 品牌,此時我們就可以使用抽象工廠,抽象衣服,鞋子,每一個品牌自行去實現具體的衣服和鞋子

  • demo 2

3.  生成器模式

能夠分步驟創建復雜對象

案例:

建一座建筑,無論你是冰室,還是住房,是非常復雜的,我們演示簡化為 4 個步驟,每個步驟都會創建新的對象,大體會經歷如下步驟

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

4.  原型模式

能夠復制已有對象, 而又無需使代碼依賴它們所屬的類

案例:

此時可以想到我們的程序目錄,和目錄下的文件,是否可以通過這種方式實現呢?

程序的目錄和文件,能夠滿足遞歸的結構,目錄和文件,都是同樣的結構

  • demo 4

5.  單例模式

能夠保證一個類只有一個實例, 并提供一個訪問該實例的全局節點

單例實例會在結構體首次初始化時創建,若多個協程創建,如何保證協程安全呢?

package main

import (
   "fmt"
   "sync"
)

var lock sync.Mutex

var one sync.Once

type Single struct {
}

// 此時創建的  SingleInstance 默認為 零值, 也就是 nil
var 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.go
getTwoInstance: 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.  適配器模式

讓接口不兼容的對象能夠相互合作

案例:

可能我們都用過生活中的適配器吧,我們手機是 Type C 的接口,電腦是 USB 的接口,那么這個時候,如何讓 TypeC 的接口和 USB 的接口連接上呢?這個時候就可以使用適配器來處理

  • demo 6

7.  橋接模式

可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構, 從而能在開發時分別使用 案例:

不同的顯示器要接入計算機,那么計算機可以獨立開發,顯示器也可以獨立開發,無論計算機里面有 windows 的,還是 mac 的 仍然支持設置 顯示器

  • demo 7

8.  組合模式

使用它將對象組合成樹狀結構, 并且能像使用獨立對象一樣使用它們

案例:

咱們的目錄樹中有 目錄,有 文件, 目錄可以進行查詢,文件也是可以進行查詢,將他們組合起來,他們各自仍然是獨立的對象

  • demo 8

9.  代理模式

能夠提供對象的替代品或其占位符

案例:

對于 nginx 反向代理很熟悉吧,咱們手擼一個簡單的反向代理,運用代理模式

  • demo 9

10. 裝飾器模式

允許你通過將對象放入包含行為的特殊封裝對象中來為原對象綁定新的行為

案例:

年輕人喜歡喝奶茶,不同的口味不同的配置有不同的價格,喝奶茶,有原味的,有加珍珠的,有加椰果的,有加奶的 ,各有各的價格

那么 奶茶 和 珍珠,椰果,奶 是相互獨立的,各自是一個獨立的對象 我們可以在珍珠對象中,放入奶茶對象,進而達到 奶茶中加珍珠,加椰果,加奶 達到不同的價格

  • demo 10

11. 外觀模式

能為程序庫、 框架或其他復雜類提供一個簡單的接口

案例:

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

  • demo 11

12. 享元模式

通過共享多個對象所共有的相同狀態

案例:

設計一個足球比賽游戲,A 隊隊服是 紅色,B 隊隊服是 藍色,且整個隊伍就只有一個套衣服 ,此處就應用了享元模式

如果不應用享元模式,那么我們每一個人都要 new 一套衣服,咱確實沒有必要這樣做

  • demo 12

行為模式

13. 命令模式

將請求轉換為一個包含與請求相關的所有信息的獨立對象

案例:

咱們以插件的方式來注入到程序中,如 我們平日看電視,需要按按鈕,按鈕上有各種按鍵,例如開機鍵,關機鍵

另外,這個按鍵又是對于哪些設備生效呢?此處咱們是對 TV 生效,可以使用命令模式,很好的插入這些相關對象

  • demo 13

14. 策略模式

讓你定義一系列算法, 并將每種算法分別放入獨立的類中, 以使算法的對象能夠相互替換

案例:

咱們知道緩存的處理方式,有 FIFO,LFU,LRU, 那么當我們將數據載入緩存的時候,使用的算法進行切換了,我們仍然需要這個緩存是可以正常處理的,這個時候,咱們就可以使用策略模式

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

  • demo 14

15. 模板模式

在超類中定義一個算法的框架, 允許子類在不修改結構的情況下重寫算法的特定步驟

案例:

模板的方式,相信我們平日用的也非常多,舉個例子我們就能夠很好的感受到

我們要獲取消息,保存消息到緩存,生成消息回復,發送消息,這幾個步驟不變的情況下,我們可以使用 微信,可以使用企業微信,自然也是可以使用飛書來處理

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

獲取到信息之后,wechat ,wework,lark 有不同的處理方式,但是他們的整體處理結構是一樣的

  • demo 15

16. 迭代器模式

讓你能在不暴露集合底層表現形式 (列表、 棧和樹等) 的情況下遍歷集合中所有的元素

案例:

我們提供出去的接口,不期望別人能看到我們自身的數據結構,我們就可以使用迭代器的方式來進行處理,可以隱藏實際的數據結構

  • demo 16

17. 觀察者模式

允許你定義一種訂閱機制, 可在對象事件發生時通知多個 “觀察” 該對象的其他對象

案例:

這種設計模式應用很多,我們舉例一個食堂吃飯的例子

多個員工觀察食堂,食堂做好菜之后 訂閱的員工都能夠收到通知,員工便傾巢而出

  • demo 17

18. 責任鏈模式

允許你將請求沿著處理者鏈進行發送。 收到請求后, 每個處理者均可對請求進行處理, 或將其傳遞給鏈上的下個處理者

案例:

例如處理一件事情,有一個固定的流程,正如一個新員工入職

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

  • demo 18

19. 備忘錄模式

允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。

案例: 例如某白領使用備忘錄,記錄了 1 ,2 ,3 條信息,然后想調出 2 快照來進行查看

  • demo 19

20. 中介者模式

能讓你減少對象之間混亂無序的依賴關系。 該模式會限制對象之間的直接交互, 迫使它們通過一個中介者對象進行合作。

案例:

醫院里面有很多不同職業的人來看病,如何保證用戶進入醫生辦公室發生沖突呢?

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

  • demo 20

21. 狀態模式

讓你能在一個對象的內部狀態變化時改變其行為, 使其看上去就像改變了自身所屬的類一樣

案例:

售賣機暫時只售賣一種從產品,有 4 種狀態,沒貨,有貨,正在請求商品,已投幣

對于不同的狀態,應對不同的動作

  • demo 21

22. 訪問者模式

將算法與其所作用的對象隔離開來

案例:

目前有 3 種結構, Dog,Cat,Monkey 都實現了 IAnimal interface,訪問者有 AreaVs(計算面積),VolumeVs(計算體積),ColorVs (計算顏色) 都實現了 IVisitor interface

以后如果需要類似于增加計算體脂率的,那么就可以加一個 visitor 即可,且對其他的訪問者和結構沒有影響

如果需要增加結構,例如增加 pig ,那么直接去實現 Animal 即可,對其他的結構和訪問者沒有影響

有沒有覺得很巧妙呢?

  • demo 22
責任編輯:武曉燕 來源: 阿兵云原生
相關推薦

2024-07-26 08:32:44

panic?Go語言

2024-06-19 10:08:34

GoChannel工具

2024-06-13 09:10:22

2023-10-19 21:30:36

架構CQRS模式

2022-12-07 09:00:18

錯誤異常CGO

2022-12-01 08:15:41

CGOswitcherror

2020-07-10 07:58:14

Linux

2023-12-01 18:06:35

2024-08-29 10:12:35

RPC通信機制遠程過程

2024-11-15 11:11:48

2024-09-02 09:00:59

2024-01-03 07:56:50

2022-05-18 09:01:19

JSONJavaScript

2021-01-20 15:43:01

機器學習深度學習科學

2024-09-27 12:13:26

GoGTokenSSO

2021-04-18 22:06:29

機器學習算法數據

2022-06-23 13:31:21

數據科學機器學習

2018-10-26 14:10:21

2023-04-20 14:31:20

Python開發教程

2023-05-08 15:25:19

Python編程語言編碼技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 紧缚调教一区二区三区视频 | 欧美啪啪网站 | 中文字幕av网站 | 亚洲欧美一区二区三区在线 | 国产成人自拍一区 | 国产亚洲成av人在线观看导航 | 免费黄色片视频 | 国产午夜精品一区二区三区嫩草 | 久久成人免费 | 久久一起草 | 性一交一乱一伦视频免费观看 | 国户精品久久久久久久久久久不卡 | 成人欧美一区二区三区视频xxx | 欧美日产国产成人免费图片 | 91精品久久久久久久久99蜜臂 | 亚洲一区二区三区在线视频 | 成年人免费看 | va精品| 国内精品视频在线观看 | 欧美video | avmans最新导航地址 | 在线中文视频 | 欧美性吧| 日本精品裸体写真集在线观看 | 日韩免费网 | 二区av | 婷婷综合网| 国产视频日韩 | 一区二区免费视频 | 怡红院免费的全部视频 | 日韩成人影院在线观看 | 老熟女毛片 | 国产精品一区二区久久久久 | 最新国产精品 | 免费精品视频在线观看 | 青青久草 | 日韩一区二区在线视频 | 青春草91 | 五月婷婷激情网 | chinese中国真实乱对白 | 成人在线日韩 |