行为设计模式——观察者模式

观察者(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收到通知

参考文章


也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品