观察者模式(Observer Pattern)
观察者模式(Observer Pattern)是一种设计模式,它定义了对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都可以自动得到通知并且被更新。这种模式属于行为型模式。
在 Go 语言中,我们可以使用接口和结构体来实现观察者模式。以下是实现观察者模式的示例代码:
package main
import "fmt"
// Observer 定义观察者接口
type Observer interface {
Update(subject Subject)
}
// Subject 定义主题接口
type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify()
}
// ConcreteObserver 实现观察者
type ConcreteObserver struct {
name string
}
func (co *ConcreteObserver) Update(subject Subject) {
fmt.Printf("%s received notification from %v\n", co.name, subject)
}
// ConcreteSubject 实现主题
type ConcreteSubject struct {
observers []Observer
}
func (cs *ConcreteSubject) Register(observer Observer) {
cs.observers = append(cs.observers, observer)
}
func (cs *ConcreteSubject) Unregister(observer Observer) {
for i, o := range cs.observers {
if o == observer {
cs.observers = append(cs.observers[:i], cs.observers[i+1:]...)
break
}
}
}
func (cs *ConcreteSubject) Notify() {
for _, o := range cs.observers {
o.Update(cs)
}
}
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()
}
在上面的示例代码中,我们首先定义了两个接口:Observer
和 Subject
。Observer
接口定义了观察者对象必须实现的方法 Update
,而 Subject
接口定义了主题对象必须实现的方法 Register、Unregister
和 Notify
。
然后,我们实现了观察者对象 ConcreteObserver
和主题对象 ConcreteSubject
。ConcreteObserver
中的 Update
方法实现了当接收到通知时的行为,而 ConcreteSubject
中的 Register、Unregister
和 Notify
方法则实现了主题对象的注册、取消注册和通知观察者的行为。
在 main 函数中,我们创建了一个主题对象和两个观察者对象,并将观察者对象注册到主题对象中。然后,我们发送了两次通知,第一次会通知两个观察者对象,而第二次只会通知一个观察者对象(因为我们在第一次通知后取消了一个观察者对象的注册)。
推荐文章: