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

Golang语言情怀-第30期 Go 语言设计模式 观察者

作者头像
李海彬
发布2021-02-05 16:21:41
3440
发布2021-02-05 16:21:41
举报
文章被收录于专栏:Golang语言社区Golang语言社区

1 定义

观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个柱体对象,这个柱体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

UML类图:

观察者模式包含四个角色:

  • Subject(抽象目标):又称为主题,是被观察的对象
  • ConcreteSubject(具体目标):抽象目标的子类,通常包含有经常发生改变的数据,当它的状态发生改变时,向其各个观察者发出通知
  • Observer(抽象观察者):观察者将对观察目标的改变做出反应
  • ConcreteObserver(具体观察者):具体观察者中维持一个指向具体目标对象的引用,它用于存储具体观察者的有关状态,这些状态和具体目标的状态保持一致

我们下面以上班(在上班的时候有些同事会看股票行情,有些还会看NBA,老板则偶尔会走动,前台秘书和同事的关系比较好,等老板出来走动的时候,她会通知每位同事)为例,其UML类图如下:

1.1 Subject类实现

代码语言:javascript
复制
//Subject 观察目标类
type Subject struct {
    state    int
    observer *list.List
}

//NewSubject 实例化观察目标
func NewSubject() *Subject {
    return &Subject{
        state:    0,
        observer: list.New(),
    }
}

//GetState 获取观察目标状态值
func (s *Subject) GetState() int {
    return s.state
}

//SetState 设置观察目标状态值
func (s *Subject) SetState(st int) {
    s.state = st
    //通知观察者
    s.NotifyAllObserver()
}

//Attach 将观察者绑定到自己
func (s *Subject) Attach(ob Observer) {
    s.observer.PushBack(ob)
}

//NotifyAllObserver 通知所有观察值
func (s *Subject) NotifyAllObserver() {
    for i := s.observer.Front(); i != nil; i = i.Next() {
        i.Value.(Observer).Update()
    }
}

1.2 观察者类实现

代码语言:javascript
复制
//Observer 观察者抽象接口
type Observer interface {
    Update()
}

//BinaryObserver 二进制观察者类
type BinaryObserver struct {
    subject *Subject
}

//NewBinaryObserver 实例化二进制观察者类
func NewBinaryObserver() *BinaryObserver {
    return &BinaryObserver{}
}

//Attach 将二进制观察者绑定到观察目标
func (bo *BinaryObserver) Attach(sub *Subject) {
    bo.subject = sub
    bo.subject.Attach(bo) //观察目标将本观察者加入更新链
}

//Update 二进制观察者接受被观察目标的更新信息
func (bo *BinaryObserver) Update() {
    fmt.Printf("Binary String: %b \n", bo.subject.GetState())
}

1.3 测试

代码语言:javascript
复制
func ObserverTest(t *testing.T) {
    subject := NewSubject()

    hexOB := NewHexObserver()
    DecOB := NewDecimalistmObserver()
    binayOB := NewBinaryObserver()

    hexOB.Attach(subject)
    DecOB.Attach(subject)
    binayOB.Attach(subject)

    fmt.Println("First state change: 8")
    subject.SetState(8)
    fmt.Println("First state change: 15")
    subject.SetState(15)
}

参考资料:

Go语言设计模式-观察者

https://studygolang.com/articles/31106

设计模式

https://blog.csdn.net/clouduncle/article/details/83688268

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言情怀 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 定义
    • 1.1 Subject类实现
      • 1.2 观察者类实现
        • 1.3 测试
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档