行为型 观察者模式

为什么需要观察者模式

观察者模式又命名为发布订阅模式,朋友们对这种模式应该屡见不鲜了。结合各种消息队列工具,这种设计模式还可以实现跨进程通信。是用法上一般分为两步:注册和在状态改变后向依赖对象发送通知。

被依赖的对象称为被观察者,依赖对象称为观察者,也可以分别称为生产者和消费者。

实现

观察者模式一般可以分为阻塞同步和非阻塞同步实现。

阻塞同步实现

go.mod

module observer

go 1.13

observer.go

package observer

import "fmt"

type Producer interface {
	Register(Consumer)
	Notify()
}

type Item struct {
	methods []Consumer
}

func (item *Item) Register(c Consumer) {
	item.methods = append(item.methods, c)
}

func (item *Item) Notify() {
	// item has changed status

	// notify
	for _, c := range item.methods {
		c.Action()
	}
}

// Consumer defines observer behavior
type Consumer interface {
	Action()
}

type Email struct {
}

func (e *Email) Action() {
	fmt.Println("Email sent")
}

type SMS struct {
}

func (sms *SMS) Action() {
	fmt.Println("Message sent")
}

测试这里我采用了Example的方法来观察输出。 observer_test.go

package observer_test

import "observer"

func ExampleProducer() {
	item := &observer.Item{}
	item.Register(&observer.Email{})
	item.Register(&observer.SMS{})
	item.Notify()
	// Output:
	// Email sent
	// Message sent
}

执行: go test observer -v

Previous
Next