Subject(被观察者或目标,抽象主题):
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject(具体被观察者或目标,具体主题):
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者):
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver(具体观察者):
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
package main
import "log"
// Listener 抽象监听者
type Listener interface {
Update()
}
// Notifier 抽象通知者
type Notifier interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
Notify()
}
type OrderNotifier struct {
Listeners []Listener
}
func NewOrderNotifier() *OrderNotifier {
return &OrderNotifier{}
}
func (o *OrderNotifier) AddListener(listener Listener) {
o.Listeners = append(o.Listeners, listener)
}
func (o *OrderNotifier) RemoveListener(listener Listener) {
for index, l := range o.Listeners {
if listener != l {
continue
}
o.Listeners = append(o.Listeners[:index], o.Listeners[index+1:]...)
}
}
func (o *OrderNotifier) Notify() {
for _, listener := range o.Listeners {
listener.Update()
}
}
// CreateSmsListener 订单创建短信通知
type CreateSmsListener struct {
OrderNo string
}
// Update 通知事件
func (l *CreateSmsListener) Update() {
// 处理具体业务逻辑
log.Printf("订单【%s】已发送短信通知", l.OrderNo)
}
// CreateEmailListener 订单创建邮件通知
type CreateEmailListener struct {
OrderNo string
}
// Update 通知事件
func (l *CreateEmailListener) Update() {
// 处理具体业务逻辑
log.Printf("订单【%s】已发送邮件通知", l.OrderNo)
}
func main() {
orderNO := "XN0221122933"
notifier := NewOrderNotifier()
notifier.AddListener(&CreateSmsListener{OrderNo: orderNO})
notifier.AddListener(&CreateEmailListener{OrderNo: orderNO})
notifier.Notify()
}