欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年07月17日 08:16:54   作者:demo007x  
觀察者是一種行為設(shè)計模式, 允許一個對象將其狀態(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

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

相關(guān)文章

  • 使用Go語言發(fā)送郵件的示例代碼

    使用Go語言發(fā)送郵件的示例代碼

    很多朋友想試試用Go語言發(fā)送郵件,所以接下來小編給大家介紹一下如何用Go語言發(fā)送郵件,文中通過代碼實例講解的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Go操作redis與redigo的示例解析

    Go操作redis與redigo的示例解析

    這篇文章主要為大家介紹了Go操作redis與redigo的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • goland 實現(xiàn)自動格式化代碼

    goland 實現(xiàn)自動格式化代碼

    這篇文章主要介紹了goland 實現(xiàn)自動格式化代碼的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 深入解析Go語言的io.ioutil標(biāo)準(zhǔn)庫使用

    深入解析Go語言的io.ioutil標(biāo)準(zhǔn)庫使用

    這篇文章主要介紹了Go語言的io.ioutil標(biāo)準(zhǔn)庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • golang 流式讀取和發(fā)送使用場景示例

    golang 流式讀取和發(fā)送使用場景示例

    這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • golang語言中for循環(huán)語句用法實例

    golang語言中for循環(huán)語句用法實例

    這篇文章主要介紹了golang語言中for循環(huán)語句用法,實例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Go代碼檢查的推薦工具及使用詳解

    Go代碼檢查的推薦工具及使用詳解

    這篇文章主要為大家介紹了Go代碼檢查的推薦工具及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 淺談Golang內(nèi)存逃逸

    淺談Golang內(nèi)存逃逸

    本文主要介紹了Golang內(nèi)存逃逸,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn)

    pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn)

    本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論