观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都会自动得到通知并更新。在 Golang 中实现观察者模式可以使用接口和函数来实现。
下面是一个使用 Golang 实现观察者模式的示例代码:
package main
import (
"fmt"
"sync"
)
type Observer interface {
Update(msg string)
}
type Subject struct {
observers []Observer
mutex sync.Mutex
}
func (s *Subject) RegisterObserver(observer Observer) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.observers = append(s.observers, observer)
}
func (s *Subject) RemoveObserver(observer Observer) {
s.mutex.Lock()
defer s.mutex.Unlock()
for i, o := range s.observers {
if o == observer {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
break
}
}
}
func (s *Subject) NotifyObservers(msg string) {
s.mutex.Lock()
defer s.mutex.Unlock()
for _, observer := range s.observers {
observer.Update(msg)
}
}
type ConcreteObserver1 struct{}
func (o *ConcreteObserver1) Update(msg string) {
fmt.Println("ConcreteObserver1 received message:", msg)
}
type ConcreteObserver2 struct{}
func (o *ConcreteObserver2) Update(msg string) {
fmt.Println("ConcreteObserver2 received message:", msg)
}
func main() {
subject := &Subject{}
observer1 := &ConcreteObserver1{}
observer2 := &ConcreteObserver2{}
subject.RegisterObserver(observer1)
subject.RegisterObserver(observer2)
subject.NotifyObservers("Hello World!")
subject.RemoveObserver(observer2)
subject.NotifyObservers("Goodbye World!")
}
在上面的代码中,我们定义了一个 Observer 接口,它包含一个 Update 方法,用于接收通知。我们还定义了一个 Subject 结构体,它包含一个 observers 切片用于存储观察者对象,并使用 sync.Mutex 来保证线程安全。
在 Subject 结构体中,我们定义了三个方法:RegisterObserver、RemoveObserver 和 NotifyObservers。RegisterObserver 方法用于注册观察者对象,RemoveObserver 方法用于移除观察者对象,NotifyObservers 方法用于通知所有观察者对象。
接下来,我们定义了两个具体的观察者类:ConcreteObserver1 和 ConcreteObserver2,它们实现了 Observer 接口的 Update 方法,用于接收通知并输出消息。
最后,在 main 函数中,我们创建了一个 Subject 实例和两个观察者实例,并分别调用 RegisterObserver 方法来注册观察者对象。然后,我们调用 NotifyObservers 方法来通知所有观察者对象,并输出相应的消息。接着,我们调用 RemoveObserver 方法来移除一个观察者对象,再次调用 NotifyObservers 方法来