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()
}

该文通过Go代码展示了观察者模式的应用,创建了一个OrderNotifier通知者,它可以添加、移除和通知监听器(如CreateSmsListener和CreateEmailListener)。当订单状态变化时,监听器通过Update方法处理相应的业务逻辑,例如发送短信或邮件通知。
705

被折叠的 条评论
为什么被折叠?



