最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go設計模式之觀察者模式講解和代碼示例

 更新時間:2023年07月17日 08:16:54   作者:demo007x  
觀察者是一種行為設計模式, 允許一個對象將其狀態(tài)的改變通知其他對象,觀察者模式提供了一種作用于任何實現(xiàn)了訂閱者接口的對象的機制, 可對其事件進行訂閱和取消訂閱,本文就通過代碼示例給大家詳細介紹一下Go的觀察者模式,需要的朋友可以參考下

概念示例

在電商網(wǎng)站中, 商品時不時地會出現(xiàn)缺貨情況。 可能會有客戶對于缺貨的特定商品表現(xiàn)出興趣。 這一問題有三種解決方案:

  • 客戶以一定的頻率查看商品的可用性。
  • 電商網(wǎng)站向客戶發(fā)送有庫存的所有新商品。
  • 客戶只訂閱其感興趣的特定商品, 商品可用時便會收到通知。 同時, 多名客戶也可訂閱同一款產(chǎn)品。

選項 3 是最具可行性的, 這其實就是觀察者模式的思想。 觀察者模式的主要組成部分有:

  • 會在有任何事發(fā)生時發(fā)布事件的主體。
  • 訂閱了主體事件并會在事件發(fā)生時收到通知的觀察者。

subject.go: 主體

package main
type Subject interface {
	register(observer Observer)
	deregister(obs Observer)
	notifyAll()
}

item.go: 具體主體

package main
import (
	"fmt"
)
type Item struct {
	observerList []Observer // 多個觀察者
	name         string
	inStock      bool // 有庫存
}
func newItem(name string) *Item {
	return &Item{
		name:    name,
		inStock: false,
	}
}
// 更新狀態(tài)
func (i *Item) updateAvailability() {
	fmt.Printf("Item %s is now in stock \n", i.name)
	i.inStock = true // 更新狀態(tài),有庫存 s
	i.notifyAll()
}
func (i *Item) register(o Observer) {
	i.observerList = append(i.observerList, o)
}
func (i *Item) deregister(o Observer) {
	i.observerList = removeFromslice(i.observerList, o)
}
func (i *Item) notifyAll() {
	for _, v := range i.observerList {
		v.update(i.name)
	}
}
func removeFromslice(observerList []Observer, observerToRemove Observer) []Observer {
	observerListLength := len(observerList)
	for i, observer := range observerList {
		if observerToRemove.getID() == observer.getID() {
			observerList[observerListLength-1], observerList[i] = observerList[i], observerList[observerListLength-1]
			return observerList[:observerListLength-1]
		}
	}
	return observerList
}

observer.go: 觀察者

package main
type Observer interface {
	update(string)
	getID() string
}

customer.go: 具體觀察者

package main
import "fmt"
type Customer struct {
	id string
}
func (c *Customer) getID() string {
	return c.id
}
func (c *Customer) update(iteName string) {
	fmt.Printf("Sendint email to customer %s for item %s\n", c.id, iteName)
}

main.go: 客戶端代碼

package main
func main() {
	shirtItem := newItem("Nick Shirt")
	observerFirst := &Customer{
		id: "abc@gmail.com",
	}
	observerSecond := &Customer{
		id: "def@gmail.com",
	}
	shirtItem.register(observerFirst)
	shirtItem.register(observerSecond)
	shirtItem.updateAvailability()
}

output.txt: 執(zhí)行結(jié)果

Item Nick Shirt is now in stock 
Sendint email to customer abc@gmail.com for item Nick Shirt
Sendint email to customer def@gmail.com for item Nick Shirt

到此這篇關于Go設計模式之觀察者模式講解和代碼示例的文章就介紹到這了,更多相關Go觀察者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang對自定義類型進行排序的解決方法

    golang對自定義類型進行排序的解決方法

    學習一門編程語言,要掌握原子數(shù)據(jù)類型,還需要掌握自定義數(shù)據(jù)類型。下面這篇文章主要給大家介紹了關于golang如何對自定義類型進行排序的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • 詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較

    詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較

    本篇文章主要介紹了詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 基于Go Int轉(zhuǎn)string幾種方式性能測試

    基于Go Int轉(zhuǎn)string幾種方式性能測試

    這篇文章主要介紹了Go Int轉(zhuǎn)string幾種方式測試,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中OCR常用識別庫的使用與實戰(zhàn)指南

    Go語言中OCR常用識別庫的使用與實戰(zhàn)指南

    Go 生態(tài)里沒有像 Python 那樣大量直接內(nèi)置 OCR 模型的庫,但可以通過調(diào)用成熟 OCR 引擎(Tesseract)、用 OpenCV 做預處理、或接入云 OCR 服務來構(gòu)建穩(wěn)定的 OCR 流水線,本文把常見方案、優(yōu)缺點、實戰(zhàn)代碼與工程級建議都列出來,需要的可以了解下
    2025-11-11
  • Go高級特性探究之穩(wěn)定排序詳解

    Go高級特性探究之穩(wěn)定排序詳解

    Go 語言提供了 sort 包,其中最常用的一種是 sort.Slice() 函數(shù),本篇文章將為大家介紹如何使用 sort.SliceStable() 對結(jié)構(gòu)體數(shù)組的某個字段進行穩(wěn)定排序,感興趣的可以了解一下
    2023-06-06
  • Golang語言如何讀取http.Request中body的內(nèi)容

    Golang語言如何讀取http.Request中body的內(nèi)容

    這篇文章主要介紹了Golang語言如何讀取http.Request中body的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Golang內(nèi)存管理之內(nèi)存逃逸分析

    Golang內(nèi)存管理之內(nèi)存逃逸分析

    逃逸分析是指由編譯器決定內(nèi)存分配的位置,不需要程序員指定,這篇文章主要為大家詳細介紹了Golang中內(nèi)存逃逸分析的幾種方法,需要的可以參考一下
    2023-07-07
  • Golang中由零值和gob庫特性引起B(yǎng)UG解析

    Golang中由零值和gob庫特性引起B(yǎng)UG解析

    這篇文章主要為大家介紹了Golang中由零值和gob庫特性引起B(yǎng)UG解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Golang中crypto/cipher加密標準庫全面指南

    Golang中crypto/cipher加密標準庫全面指南

    本文主要介紹了Golang中crypto/cipher加密標準庫,包括對稱加密、非對稱加密以及使用流加密和塊加密算法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • GO使用Mutex確保并發(fā)程序正確性詳解

    GO使用Mutex確保并發(fā)程序正確性詳解

    這篇文章主要為大家介紹了GO使用Mutex確保并發(fā)程序正確性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

大新县| 筠连县| 揭东县| 易门县| 宁武县| 南阳市| 广南县| 甘南县| 寻甸| 海南省| 德江县| 东光县| 丰台区| 明水县| 汶上县| 巴南区| 台江县| 仁怀市| 姚安县| 隆子县| 柳江县| 廉江市| 德阳市| 诸城市| 邹城市| 淳安县| 和龙市| 昌图县| 昂仁县| 蒙阴县| 安达市| 白山市| 江油市| 安图县| 治县。| 林州市| 定襄县| 巴中市| 文成县| 台北县| 竹溪县|