觀察者模式通過(guò)Subject和Observer接口實(shí)現(xiàn)事件訂閱與通知,使用EventCenter管理觀察者并線程安全地廣播事件,需注意及時(shí)取消訂閱以避免內(nèi)存泄漏。
在Go語(yǔ)言中,觀察者模式可用于實(shí)現(xiàn)事件的訂閱與通知機(jī)制,常見(jiàn)于解耦事件發(fā)布者和多個(gè)響應(yīng)者。通過(guò)定義主題(Subject)和觀察者(Observer)接口,可以靈活地管理事件訂閱、取消和廣播。
觀察者模式的核心是主題和觀察者之間的約定。主題負(fù)責(zé)維護(hù)訂閱者列表,并在狀態(tài)變化時(shí)通知所有觀察者。
以下是一個(gè)基礎(chǔ)接口設(shè)計(jì):Observer接口:定義接收通知的方法。
Subject接口:定義添加、刪除和通知觀察者的方法。
type Event string type Observer interface { OnNotify(Event) } type Subject interface { Subscribe(Observer) Unsubscribe(Observer) Notify(Event) }
使用一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)Subject接口,維護(hù)觀察者集合,并提供線程安全的操作。
無(wú)階未來(lái)模型擂臺(tái)/AI 應(yīng)用平臺(tái),一站式模型+應(yīng)用平臺(tái)
func NewEventCenter() *EventCenter { return &EventCenter{ observers: make(map[Observer]bool), } }
func (ec *EventCenter) Subscribe(o Observer) { ec.mutex.Lock() defer ec.mutex.Unlock() ec.observers[o] = true }
func (ec *EventCenter) Unsubscribe(o Observer) { ec.mutex.Lock() defer ec.mutex.Unlock() delete(ec.observers, o) }
func (ec *EventCenter) Notify(event Event) { ec.mutex.RLock() defer ec.mutex.RUnlock() for observer := range ec.observers { observer.OnNotify(event) } }
<H3>編寫(xiě)具體觀察者</H3> <p>每個(gè)需要響應(yīng)事件的組件實(shí)現(xiàn)Observer接口即可自動(dòng)接收通知。</p> <font color="#666">例如,日志記錄器和郵件通知服務(wù):</font> ```go type Logger struct{} func (l *Logger) OnNotify(event Event) { fmt.Printf("日志記錄: %s\n", event) } type EmailNotifier struct{} func (e *EmailNotifier) OnNotify(event Event) { if event == "user_registered" { fmt.Println("發(fā)送歡迎郵件...") } }
將觀察者注冊(cè)到事件中心,觸發(fā)事件后自動(dòng)廣播。
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
```go func main() { center := NewEventCenter()logger := &Logger{} emailer := &EmailNotifier{} center.Subscribe(logger) center.Subscribe(emailer) center.Notify("user_registered") // 輸出: // 日志記錄: user_registered // 發(fā)送歡迎郵件... center.Unsubscribe(emailer) center.Notify("order_paid") // 只有日志輸出
}
<p>基本上就這些。Go沒(méi)有內(nèi)置事件系統(tǒng),但通過(guò)接口和組合,能簡(jiǎn)潔實(shí)現(xiàn)觀察者模式。關(guān)鍵是避免內(nèi)存泄漏——記得在適當(dāng)時(shí)機(jī)取消訂閱,尤其是短期存在的觀察者。</p>
以上就是Golang如何使用觀察者模式實(shí)現(xiàn)事件訂閱的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)