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

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

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

概念示例

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

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

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

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

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 // 多個(gè)觀察者
	name         string
	inStock      bool // 有庫(kù)存
}
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),有庫(kù)存 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è)計(jì)模式之觀察者模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    Go操作redis與redigo的示例解析

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

    goland 實(shí)現(xiàn)自動(dòng)格式化代碼

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

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

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

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

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

    golang中context的作用詳解

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

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

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

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

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

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

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

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

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

最新評(píng)論