Go設(shè)計模式之觀察者模式講解和代碼示例
概念示例
在電商網(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語言的io.ioutil標(biāo)準(zhǔn)庫使用
這篇文章主要介紹了Go語言的io.ioutil標(biāo)準(zhǔn)庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn)
本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04