观察者(Observer)模式也叫事件订阅者模式,是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。
假如你有两种类型的对象: 顾客和商店。顾客对某个特定品牌的产品非常感兴趣(例如最新型号的 iPhone 手机),而该产品很快将会在商店里出售。
顾客可以每天来商店看看产品是否到货。但如果商品尚未到货时,绝大多数来到商店的顾客都会空手而归。
另一方面,每次新产品到货时,商店可以向所有顾客发送邮件(可能会被视为垃圾邮件)。这样,部分顾客就无需反复前往商店了,但也可能会惹恼对新产品没有兴趣的其他顾客。
我们似乎遇到了一个矛盾:要么让顾客浪费时间检查产品是否到货,要么让商店浪费资源去通知没有需求的顾客。
观察者模式允许一个实例(可以称为目标对象)发布各种事件(event)给其他实例(观察者)。这些观察者会对目标对象进行订阅,这样每当目标对象发生变化时,观察者就会收到事件(event)通知。
package main
import (
"fmt"
)
// 发布者(被观察者)
type Publisher struct {
subscribers []*Subscriber
}
func (p *Publisher) AddSubscriber(s *Subscriber) {
p.subscribers = append(p.subscribers, s)
fmt.Println(s.name + "已订阅")
}
func (p *Publisher) Notify() {
fmt.Println("通知大家新商品到货")
for _, s := range p.subscribers {
s.DoJob()
}
}
// 订阅者(观察者)
type Subscriber struct {
name string
}
func (s *Subscriber) DoJob() {
fmt.Println(s.name + "收到通知")
}
func main() {
s1 := &Subscriber{name: "axiaoxin"}
s2 := &Subscriber{name: "lihua"}
shop := Publisher{}
shop.AddSubscriber(s1)
shop.AddSubscriber(s2)
shop.Notify()
}
运行示例代码,输出结果:
axiaoxin已订阅
lihua已订阅
通知大家新商品到货
axiaoxin收到通知
lihua收到通知
参考文章