1、原理
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式(Observer)又称发布-订阅模式(Publish-Subscribe:Pub/Sub)。它是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。
在最基础的观察者模式中,包括以下四个角色:
2、示例
示例代码:
package main
import "fmt"
type Observer interface {
Update(subject *Subject)
}
type Subject struct {
observers []Observer
msg string
}
//添加观察者
func (s *Subject) Attach(o Observer) {
s.observers = append(s.observers, o)
}
//通知信息到观察者
func (s *Subject) Notify() {
for _, o := range s.observers {
o.Update(s) //调用接口对应的方法
}
}
//更新信息
func (s *Subject) UpdateMsg(context string) {
s.msg = context
s.Notify()
}
func NewSubject()*Subject {
return &Subject{
observers: make([]Observer,0),
msg: "",
}
}
//=======信息接受者======
type Reader struct {
name string
}
func (r *Reader) Update(s *Subject) {
fmt.Printf("【%s】收到的信息:%v\n", r.name, s.msg)
}
func NewReader(name string) *Reader {
return &Reader{name: name}
}
func main() {
subject := NewSubject()
r1 := NewReader("张三")
r2 := NewReader("李四")
r3 := NewReader("王五")
subject.Attach(r1)
subject.Attach(r2)
subject.Attach(r3)
subject.UpdateMsg("MM来了")
//subject.Notify()
r4:=NewReader("赵六")
subject.Attach(r4) //添加新的观察者
subject.UpdateMsg("好漂亮")
}
UML图: