目录
????????观察者模式(Observer Pattern)定义了对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都可以自动得到通知并且被更新。观察者模式是一种一对多的关系,可以有任意个(1个或多个)观察者对象同时监听(观察)某一个对象。
(1)优点:
(2)缺点:
package main
import "fmt"
// 新闻发布系统,用户可以订阅感兴趣的新闻主题,并在新闻发布时收到通知。
// 希望能够实现一个观察者模式,使订阅者能够接收到相关新闻的通知。
// 主题接口
type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify()
}
// 具体主题
type NewsSubject struct {
observers []Observer
news string
}
// 注册
func (n *NewsSubject) Register(observer Observer) {
n.observers = append(n.observers, observer)
}
// 注销
func (n *NewsSubject) Unregister(observer Observer) {
for i, o := range n.observers {
if o == observer {
n.observers = append(n.observers[:i], n.observers[i+1:]...)
break
}
}
}
// 通知观察者
func (n *NewsSubject) Notify() {
for _, observer := range n.observers {
observer.Update(n)
}
}
func (n *NewsSubject) SetNews(news string) {
n.news = news
n.Notify()
}
// 观察者接口
type Observer interface {
Update(subject Subject)
}
// 具体观察者
type Subscriber struct {
name string
}
func (s *Subscriber) Update(subject Subject) {
newsSubject := subject.(*NewsSubject)
fmt.Printf("[%s] 收到新闻通知:%s\n", s.name, newsSubject.news)
}
// 客户端代码
func main() {
subject := &NewsSubject{}
subscriber1 := &Subscriber{name: "订阅者1"}
subject.Register(subscriber1)
subscriber2 := &Subscriber{name: "订阅者2"}
subject.Register(subscriber2)
subject.SetNews("新闻1发布了")
subject.SetNews("新闻2发布了")
subject.Unregister(subscriber1)
subject.SetNews("新闻3发布了")
}