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

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

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

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

相關(guān)文章

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

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

    學(xué)習(xí)一門編程語言,要掌握原子數(shù)據(jù)類型,還需要掌握自定義數(shù)據(jù)類型。下面這篇文章主要給大家介紹了關(guān)于golang如何對自定義類型進行排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    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 做預(yù)處理、或接入云 OCR 服務(wù)來構(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)存分配的位置,不需要程序員指定,這篇文章主要為大家詳細(xì)介紹了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加密標(biāo)準(zhǔn)庫全面指南

    Golang中crypto/cipher加密標(biāo)準(zhǔn)庫全面指南

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

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

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

最新評論

尉犁县| 新邵县| 宜昌市| 石河子市| 商城县| 全州县| 耿马| 元朗区| 巨鹿县| 衡阳市| 馆陶县| 平度市| 双城市| 长白| 金堂县| 桐庐县| 石狮市| 湘西| 榆林市| 微博| 子洲县| 乃东县| 含山县| 剑川县| 新余市| 博兴县| 佛学| 无极县| 铜川市| 府谷县| 塔城市| 苏尼特左旗| 六安市| 河南省| 繁昌县| 昌黎县| 麻阳| 温州市| 铜鼓县| 潞西市| 即墨市|