在Go語言中實(shí)現(xiàn)觀察者模式,可以按照以下步驟進(jìn)行:
type Subject interface {
Register(observer Observer) // 注冊(cè)觀察者
Unregister(observer Observer) // 取消注冊(cè)觀察者
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實(shí)現(xiàn)了Subject接口,ConcreteObserver實(shí)現(xiàn)了Observer接口。當(dāng)Subject的狀態(tài)發(fā)生變化時(shí),通過調(diào)用Notify方法通知所有注冊(cè)的觀察者進(jìn)行更新。在main函數(shù)中,我們創(chuàng)建了一個(gè)ConcreteSubject對(duì)象,并注冊(cè)了兩個(gè)ConcreteObserver對(duì)象。然后通過調(diào)用Notify方法通知所有觀察者進(jìn)行更新。最后,我們?nèi)∠?cè)了observer1,并再次調(diào)用Notify方法,此時(shí)只有observer2會(huì)收到通知。