以下是一个使用Go语言实现观察者模式的示例:
package main
import (
"fmt"
)
// 定义观察者接口
type Observer interface {
Update(string)
}
// 定义被观察者接口
type Subject interface {
RegisterObserver(Observer)
RemoveObserver(Observer)
NotifyObservers()
}
// 具体的观察者类型
type ConcreteObserver struct {
name string
}
func (co *ConcreteObserver) Update(msg string) {
fmt.Printf("[%s] 收到消息:%s\n", co.name, msg)
}
// 具体的被观察者类型
type ConcreteSubject struct {
observers []Observer
}
func (cs *ConcreteSubject) RegisterObserver(observer Observer) {
cs.observers = append(cs.observers, observer)
}
func (cs *ConcreteSubject) RemoveObserver(observer Observer) {
for i, obs := range cs.observers {
if obs == observer {
cs.observers = append(cs.observers[:i], cs.observers[i+1:]...)
break
}
}
}
func (cs *ConcreteSubject) NotifyObservers() {
for _, observer := range cs.observers {
observer.Update("主题发生变化")
}
}
func main() {
subject := &ConcreteSubject{}
ob1 := &ConcreteObserver{name: "观察者1"}
ob2 := &ConcreteObserver{name: "观察者2"}
subject.RegisterObserver(ob1)
subject.RegisterObserver(ob2)
subject.NotifyObservers()
subject.RemoveObserver(ob1)
subject.NotifyObservers()
}
在这个示例中,我们定义了一个Observser
接口和一个Subject
接口作为观察者模式的基础。具体的观察者类型ConcreteObserver
实现了Update
方法用于接收和处理消息。具体的被观察者类型ConcreteSubject
维护了一个观察者列表,并实现了注册、移除和通知观察者的方法。
在主函数中,我们创建了一个被观察者对象,并注册了两个观察者。然后通过调用NotifyObservers
方法来通知所有观察者,并可以根据需要移除某个观察者。
当运行这段代码时,你会看到输出中显示每个观察者都收到了相应的消息。这就是使用Go语言实现的简单观察者模式示例。
内容由零声教学AI助手提供,问题来源于学员提问