在Go語言中實現觀察者模式,可以按照以下步驟進行:
type Subject interface {
Register(observer Observer) // 注冊觀察者
Unregister(observer Observer) // 取消注冊觀察者
Notify() // 通知觀察者
}
type Observer interface {
Update() // 觀察者更新方法
}
type ConcreteSubject struct {
observers []Observer
}
func (s *ConcreteSubject) Register(observer Observer) {
s.observers = append(s.observers, observer)
}
func (s *ConcreteSubject) Unregister(observer Observer) {
for i, o := range s.observers {
if o == observer {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
break
}
}
}
func (s *ConcreteSubject) Notify() {
for _, observer := range s.observers {
observer.Update()
}
}
type ConcreteObserver struct {
name string
}
func (o *ConcreteObserver) Update() {
fmt.Println(o.name, "received notification")
}
func main() {
subject := &ConcreteSubject{}
observer1 := &ConcreteObserver{name: "Observer 1"}
observer2 := &ConcreteObserver{name: "Observer 2"}
subject.Register(observer1)
subject.Register(observer2)
subject.Notify()
subject.Unregister(observer1)
subject.Notify()
}
在上述代碼中,ConcreteSubject實現了Subject接口,ConcreteObserver實現了Observer接口。當Subject的狀態發生變化時,通過調用Notify方法通知所有注冊的觀察者進行更新。在main函數中,我們創建了一個ConcreteSubject對象,并注冊了兩個ConcreteObserver對象。然后通過調用Notify方法通知所有觀察者進行更新。最后,我們取消注冊了observer1,并再次調用Notify方法,此時只有observer2會收到通知。