在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是觀察者設計模式?Golang中的觀察者模式介紹

馬哥Linux運維 ? 來源:稀土掘金 ? 2024-01-08 10:08 ? 次閱讀

當涉及到訂單處理系統時,觀察者設計模式可以用于實現訂單狀態的變化和通知。在這篇文章中,我們將介紹如何使用Golang來實現觀察者設計模式,并提供一個基于訂單處理系統的代碼示例。

什么是觀察者設計模式?

觀察者設計模式是一種行為型設計模式,它允許對象之間的松耦合通信。在這種模式中,一個對象(稱為主題Subject)維護一組依賴于它的對象(稱為觀察者Observer)的列表,并在狀態改變時自動通知它們。觀察者模式可以用于實現事件驅動的系統,其中對象之間的交互是通過事件的發布和訂閱來完成的。

應用場景:訂單處理系統

在訂單處理系統中,訂單的狀態可能會發生變化,例如創建、支付、發貨、取消等。當訂單狀態發生變化時,我們希望通知相關的觀察者進行相應的處理,例如更新庫存、發送通知等。

實現觀察者設計模式

在Golang中,可以使用channel和goroutine來實現觀察者設計模式。

首先,我們定義一個訂單結構體,包含訂單的基本信息和狀態:


type Order struct {
  ID     string
  Status string
}

然后,我們定義一個觀察者接口,包含一個Update方法,用于處理訂單狀態變化的通知:

type Observer interface {
  Update(order *Order, wg *sync.WaitGroup)
}

接下來,我們定義一個主題結構體,使用channel和goroutine來通知觀察者:

type Subject struct {
  observers []Observer
}


func (s *Subject) Register(observer Observer) {
  s.observers = append(s.observers, observer)
}


func (s *Subject) Notify(order *Order) {
  wg := sync.WaitGroup{}
  wg.Add(len(s.observers))


  errCh := make(chan error, len(s.observers))


  for _, observer := range s.observers {
    go func(obs Observer) {
      defer wg.Done()


      err := obs.Update(order, &wg)
      if err != nil {
        errCh <- err
      }
    }(observer)
  }


  wg.Wait()
  close(errCh)


  // 處理異常
  for err := range errCh {
    fmt.Println("Error occurred:", err)
  }
}




我們首先創建了一個errCh(類型為chan error)來接收觀察者處理過程中可能發生的異常。然后,在每個觀察者的goroutine中,我們通過閉包的方式傳遞observer并在處理完成后檢查是否有異常發生。如果有異常,我們將其發送到errCh中。

在Notify方法的最后,我們關閉了errCh通道,并通過range循環來處理所有的異常。

接下來,我們實現兩個觀察者:庫存觀察者和通知觀察者。

庫存觀察者用于更新庫存狀態:


type InventoryObserver struct{}


func (io *InventoryObserver) Update(order *Order, wg *sync.WaitGroup) {
  defer wg.Done()


  // 更新庫存狀態
  fmt.Printf("Inventory Observer: Order %s status changed to %s
", order.ID, order.Status)
}




通知觀察者用于發送通知:


type NotificationObserver struct{}


func (no *NotificationObserver) Update(order *Order, wg *sync.WaitGroup) {
  defer wg.Done()


  // 發送通知
  fmt.Printf("Notification Observer: Order %s status changed to %s
", order.ID, order.Status)
}




最后,我們在主函數中使用觀察者模式來處理訂單狀態變化的通知:


func main() {
  order := &Order{
    ID:     "123",
    Status: "Created",
  }


  subject := &Subject{}
  subject.Register(&InventoryObserver{})
  subject.Register(&NotificationObserver{})


  // 模擬訂單狀態變化
  order.Status = "Paid"
  subject.Notify(order)


  order.Status = "Shipped"
  subject.Notify(order)
}


我們創建了一個訂單對象和一個主題對象,并注冊了庫存觀察者。然后,我們模擬訂單狀態的變化,通過調用Notify方法并發地通知觀察者進行處理。

通過使用channel和goroutine,我們可以實現觀察者模式的并發處理,提高系統的性能和響應能力。

使用觀察者設計模式的一些優點

松耦合:觀察者模式可以將觀察者和主題(或被觀察者)對象解耦。觀察者只需要關注主題的狀態變化,而不需要了解具體的實現細節。這樣可以使得系統更加靈活和可擴展。

可重用性:通過將觀察者和主題對象分離,可以使得它們可以在不同的上下文中重復使用。例如,可以在不同的業務場景中使用相同的觀察者來處理不同的主題對象。

易于擴展:當需要添加新的觀察者或主題時,觀察者模式可以很方便地進行擴展。只需要實現新的觀察者或主題對象,并注冊到主題對象中即可。

事件驅動:觀察者模式適用于事件驅動的系統。當主題對象的狀態發生變化時,可以通過觸發事件來通知所有的觀察者進行相應的處理。

如果不使用觀察者設計模式

訂單業務可能會以一種更加緊耦合的方式實現。以下是一個示例代碼,展示了在沒有使用觀察者模式的情況下,如何處理訂單狀態變化的問題:


type Order struct {
  ID     string
  Status string
}


type OrderProcessor struct {
  inventoryObserver    *InventoryObserver
  notificationObserver *NotificationObserver
}


func NewOrderProcessor() *OrderProcessor {
  return &OrderProcessor{
    inventoryObserver:    &InventoryObserver{},
    notificationObserver: &NotificationObserver{},
  }
}


func (op *OrderProcessor) Process(order *Order) {
  // 更新庫存
  op.inventoryObserver.Update(order)


  // 發送通知
  op.notificationObserver.Update(order)
}


func main() {
  order := &Order{
    ID:     "123",
    Status: "Created",
  }


  op := NewOrderProcessor()


  // 模擬訂單狀態變化
  order.Status = "Paid"
  op.Process(order)


  order.Status = "Shipped"
  op.Process(order)
}


在這個示例中,OrderProcessor對象負責處理訂單狀態變化。它內部包含了InventoryObserver和NotificationObserver對象,并在Process方法中依次調用它們的Update方法來處理訂單狀態變化。

這種實現方式存在一些問題:

緊耦合:OrderProcessor對象直接依賴于InventoryObserver和NotificationObserver對象。如果需要添加或刪除其他觀察者,需要修改OrderProcessor的代碼,導致代碼的可維護性和可擴展性下降。

代碼重復:每當有新的觀察者需要處理訂單狀態變化時,都需要在OrderProcessor中添加相應的代碼。這樣會導致代碼的重復和冗余。

可擴展性差:在沒有使用觀察者模式的情況下,很難在系統中添加新的觀察者,因為每次都需要修改OrderProcessor的代碼。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理系統
    +關注

    關注

    0

    文章

    93

    瀏覽量

    16681

原文標題:Golang中的觀察者模式:優化訂單處理系統

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何觀察重復的公告?

    我能夠建立和運行“第10天”觀察員樣本項目。我在另一個DeV板上運行了一個信標,當我啟動觀察者時,它報告了“不可連接的單向廣告”,但是沒有新的事件,盡管我知道信標必須定期發布一個廣告。作為證據,如果
    發表于 10-14 07:06

    CC2540廣播角色和觀察者角色切換代碼怎么編寫?

    希望一個CC2540先通過觀察者角色獲取其他廣播的廣播數據,然后在切換為廣播角色將這些數據廣播給另外一個觀察者?這樣就需要編程實現觀察者
    發表于 03-16 10:27

    RN4020觀察者模式無法正常工作怎么回事

    中心,支持MLDP,并使UART流控制R,1//重新引導,使更改生效J,1//觀察者模式你對這個問題有什么想法?謝謝,弗朗西斯科
    發表于 04-22 09:03

    屬性觀察者的特點

    屬性觀察者,類似于觸發器。用來監視屬性的除初始化之外的屬性值變化,當屬性值發生改變時可以對此作出響應。有如下特點: 1,不僅可以在屬性值改變后觸發didSet,也可以在屬性值改變前觸發willSet
    發表于 11-04 07:10

    觀察者模式在嵌入式編程設計中有何作用

    觀察者模式是最常見的模式之一。這種模式提供一種方法來時對象“監聽”其他對象,而不需要修改任何數據服務器。在嵌入式領域,這意味著數據能夠很容易分享給其他元素。
    發表于 12-22 08:31

    基于觀察者模式的屏幕布局控件設計

    觀察者模式作為設計模式中行為模式的一種,解決了上述具有一對多依賴關系對象重用問題。文中在分析觀察者模式
    發表于 02-13 16:20 ?4次下載
    基于<b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>的屏幕布局控件設計

    Java設計模式分析之觀察者

    觀察者模式的流程跟報紙訂閱方式一致,即:觀察者模式=出版+訂閱,只是名稱不一樣,出版
    發表于 09-26 17:36 ?0次下載

    在 Java8 環境下實現觀察者模式的實例分析

    的一個組成部分。目前雖然已經有大量關于觀察者模式的文章,但它們都專注于在 Java 的實現,卻忽視了開發在Java中使用觀察者
    發表于 10-12 16:09 ?0次下載
    在 Java8 環境下實現<b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>的實例分析

    大陸正在研發一款路況觀察者應用

    據外媒報道,大陸正在研發一款路況觀察者(Road Condition Observer)應用。隨著傳感器及攝像頭技術的愈發成熟,再結合車載流媒體數據,或許能夠完成該應用的設計。此外,工程師還將為該應用寫入成熟的算法。
    發表于 05-15 11:30 ?1018次閱讀

    GoF設計模式觀察者模式

    現在有 2 個服務,Service A 和 Service B,通過 REST 接口通信;Service A 在某個業務場景下調用 Service B 的接口完成一個計算密集型任務,假設接口為 http://service_b/api/v1/domain;該任務運行時間很長,但 Service A 不想一直阻塞在接口調用上。為了滿足 Service A 的要求,通常有 2 種方案:
    的頭像 發表于 07-25 11:32 ?1045次閱讀

    設計模式行為型:觀察者模式

    定義對象之間的一種一對多依賴關系,使得每一個對象發生狀態的變化時,其相關依賴對象皆得到通知并被自動更新,又稱為發布-訂閱模式、模型-視圖模式、源-監聽器模式或從屬
    的頭像 發表于 06-07 16:56 ?691次閱讀
    設計<b class='flag-5'>模式</b>行為型:<b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>

    觀察者模式,超詳細!

    觀察者模式建議你為發布類添加訂閱機制, 讓每個對象都能訂閱或取消訂閱發布事件流。 不要害怕! 這并不像聽上去那么復雜。 實際上, 該機制包括 1) 一個用于存儲訂閱
    的頭像 發表于 08-21 16:06 ?1253次閱讀
    <b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>,超詳細!

    基于觀察者模式設計的框架-REB,使代碼模塊化

    設計模式里面的觀察者模式,一直是作者想去設計一套框架來闡述這一個模式,因此REB(Rice Event Broker)就是為了完成觀察者
    的頭像 發表于 10-17 09:35 ?701次閱讀
    基于<b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>設計的框架-REB,使代碼模塊化

    一文解析BLE觀察者模式回調機制

    nRF5 SDK從版本14開始,對事件回調機制做了更新,引入了觀察者模式,以解耦不同BLE Layer對BLE事件的回調函數。
    的頭像 發表于 11-27 10:07 ?1126次閱讀
    一文解析BLE<b class='flag-5'>觀察者</b><b class='flag-5'>模式</b>回調機制

    觀察者網:聚焦?RT-Thread睿賽德開發大會發布多個行業應用操作系統 | 媒體視角

    觀察者網報道——睿賽德開發大會在2024RT-Thread睿賽德開發大會上,RT-Thread創始人兼CEO熊譜翔隆重發布了程翧車控系統2.0,并詳細介紹了該系統的最新特性及其在汽
    的頭像 發表于 12-26 19:42 ?264次閱讀
    <b class='flag-5'>觀察者</b>網:聚焦?RT-Thread睿賽德開發<b class='flag-5'>者</b>大會發布多個行業應用操作系統 | 媒體視角
    主站蜘蛛池模板: 精品国产亚洲人成在线| 狠狠色狠色综合曰曰| 天堂tv在线观看| 天天摸天天躁天天添天天爽| 自拍偷拍福利| 久久精品国产清自在天天线| 特级一级毛片| 综合涩| 亚洲骚片| 国产成人综合日韩精品婷婷九月| 18黄网站| 国产aa| 宅男噜噜噜66| 热久久国产| 亚洲精品香蕉婷婷在线观看| 色五月丁香五月综合五月| 伊人五月婷婷| 四虎影视永久在线精品免费播放| 亚洲天堂免费在线| 精品国产污污免费网站入口| 在线观看日本免费不卡| 美女下面小内内的沟| 性欧美高清视频| 青草视频久久| 欧美日韩亚洲国内综合网俺| 靓装爱神12丝袜在线播放 | 亚洲综合色dddd26| 国产夜夜爽| 91大神免费视频| 在线天堂bt中文www在线| 三级视频网站在线观看| 日本免费黄色网| 国产亚洲婷婷香蕉久久精品 | 男女交性视频免费| 亚洲成色www久久网站| 欧美一欧美一区二三区性| 丁香六月色婷婷综合网| 久热精品在线视频| 色色激情网| 日本动漫天堂| 你懂的国产精品|