观察者模式(Observer Pattern)是软件设计模式中的一种行为型模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
观察者模式主要包含两类对象:
以下是使用Go语言实现观察者模式的示例:
package main
import "fmt"
// 观察者接口
type Observer interface {
Update(*Subject)
}
// 主题
type Subject struct {
observers []Observer
state int
}
func NewSubject() *Subject {
return &Subject{observers: make([]Observer, 0)}
}
func (s *Subject) Attach(o Observer) {
s.observers = append(s.observers, o)
}
func (s *Subject) Detach(o Observer) {
for i, observer := range s.observers {
if observer == o {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
break
}
}
}
func (s *Subject) Notify() {
for _, observer := range s.observers {
observer.Update(s)
}
}
func (s *Subject) GetState() int {
return s.state
}
func (s *Subject) SetState(state int) {
s.state = state
s.Notify()
}
// 具体观察者
type ConcreteObserver struct {
id int
}
func NewConcreteObserver(id int) *ConcreteObserver {
return &ConcreteObserver{id: id}
}
func (c *ConcreteObserver) Update(s *Subject) {
fmt.Printf("Observer %d: Subject's state changed to %d\n", c.id, s.GetState())
}
func main() {
subject := NewSubject()
observer1 := NewConcreteObserver(1)
subject.Attach(observer1)
observer2 := NewConcreteObserver(2)
subject.Attach(observer2)
subject.SetState(10)
subject.Detach(observer1)
subject.SetState(20)
}
观察者模式适用于以下场景:
优点:
缺点:
观察者模式是一种有效的方式来实现事件处理系统,它使得多个对象能够观察一个对象的状态变化,从而实现松耦合。