Go設(shè)計(jì)模式之觀察者模式講解和代碼示例
概念示例
在電商網(wǎng)站中, 商品時不時地會出現(xiàn)缺貨情況。 可能會有客戶對于缺貨的特定商品表現(xiàn)出興趣。 這一問題有三種解決方案:
- 客戶以一定的頻率查看商品的可用性。
- 電商網(wǎng)站向客戶發(fā)送有庫存的所有新商品。
- 客戶只訂閱其感興趣的特定商品, 商品可用時便會收到通知。 同時, 多名客戶也可訂閱同一款產(chǎn)品。
選項(xiàng) 3 是最具可行性的, 這其實(shí)就是觀察者模式的思想。 觀察者模式的主要組成部分有:
- 會在有任何事發(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è)計(jì)模式之觀察者模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go觀察者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入解析Go語言的io.ioutil標(biāo)準(zhǔn)庫使用
這篇文章主要介紹了Go語言的io.ioutil標(biāo)準(zhǔn)庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
golang語言中for循環(huán)語句用法實(shí)例
這篇文章主要介紹了golang語言中for循環(huán)語句用法,實(shí)例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01
pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)
本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

