15、 Golang 设计模式:15_观察者模式

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图: