前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 设计模式-观察者模式

Go 设计模式-观察者模式

作者头像
王小明_HIT
发布2021-07-27 16:33:58
3690
发布2021-07-27 16:33:58
举报
文章被收录于专栏:程序员奇点程序员奇点

设计模式

观察者模式

观察者模式,也被称为发布订阅模式(Publish-Subscribe Design Pattern)

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

翻译中文:

在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

观察者模式的

应用场景

观察者模式需要三个条件:观察者 被观察,话题订阅

实际场景可以是:

  • 公众号推送消息,独立的微信号关注多个公众号 ,每次总能收到公众号发布的更新内容,订阅号也会将公众号置顶标红提醒
  • 邮件订阅
  • RSS Feeds

代码

代码语言:javascript
复制
package observer

import "fmt"

type Subject struct {
 observers []Observer
 context   string
}

func NewSubject() *Subject {
 return &Subject{
  observers: make([]Observer, 0),
 }
}

func (s *Subject) Attach(o Observer) {
 s.observers = append(s.observers, o)
}

func (s *Subject) notify() {
 for _, o := range s.observers {
  o.Update(s)
 }
}

func (s *Subject) UpdateContext(context string) {
 s.context = context
 s.notify()
}

type Observer interface {
 Update(*Subject)
}

type Reader struct {
 name string
}

func NewReader(name string) *Reader {
 return &Reader{
  name: name,
 }
}

func (r *Reader) Update(s *Subject) {
 fmt.Printf("%s receive %s\n", r.name, s.context)
}

测试代码

代码语言:javascript
复制
package observer

func ExampleObserver() {
 subject := NewSubject()
 reader1 := NewReader("reader1")
 reader2 := NewReader("reader2")
 reader3 := NewReader("reader3")
 subject.Attach(reader1)
 subject.Attach(reader2)
 subject.Attach(reader3)

 subject.UpdateContext("observer mode")
 // Output:
 // reader1 receive observer mode
 // reader2 receive observer mode
 // reader3 receive observer mode
}

参考资料

  • https://github.com/senghoo/golang-design-pattern
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式
  • 观察者模式
  • 应用场景
  • 代码
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档