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

设计模式:观察者模式解析与Go语言实现

作者头像
运维开发王义杰
发布2023-11-20 15:19:53
1490
发布2023-11-20 15:19:53
举报

1. 引言

观察者模式(Observer Pattern)是软件设计模式中的一种行为型模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。

2. 观察者模式的结构

观察者模式主要包含两类对象:

  • 主题(Subject):它维护一组观察者,提供用于增加和移除观察者的方法。
  • 观察者(Observer):为那些在主题状态发生改变时需获得通知的对象提供一个更新接口。
3. Go语言实现示例

以下是使用Go语言实现观察者模式的示例:

代码语言:javascript
复制
package main

import "fmt"

// 观察者接口
type Observer interface {
  Update(*Subject)
}

// 主题
type Subject struct {
  observers []Observer
  state     int
}

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

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

func (s *Subject) Detach(o Observer) {
  for i, observer := range s.observers {
    if observer == o {
      s.observers = append(s.observers[:i], s.observers[i+1:]...)
      break
    }
  }
}

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

func (s *Subject) GetState() int {
  return s.state
}

func (s *Subject) SetState(state int) {
  s.state = state
  s.Notify()
}

// 具体观察者
type ConcreteObserver struct {
  id int
}

func NewConcreteObserver(id int) *ConcreteObserver {
  return &ConcreteObserver{id: id}
}

func (c *ConcreteObserver) Update(s *Subject) {
  fmt.Printf("Observer %d: Subject's state changed to %d\n", c.id, s.GetState())
}

func main() {
  subject := NewSubject()

  observer1 := NewConcreteObserver(1)
  subject.Attach(observer1)

  observer2 := NewConcreteObserver(2)
  subject.Attach(observer2)

  subject.SetState(10)
  subject.Detach(observer1)
  subject.SetState(20)
}

4. 观察者模式的应用场景

观察者模式适用于以下场景:

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中可以让它们各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
5. 观察者模式的优缺点

优点:

  • 支持简单的广播通信。
  • 观察者和主题之间的抽象耦合最小。

缺点:

  • 如果一个被观察的主题对象有很多直接和间接的观察者的话,通知每一个观察者都是耗时的。
6. 结语

观察者模式是一种有效的方式来实现事件处理系统,它使得多个对象能够观察一个对象的状态变化,从而实现松耦合。

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

本文分享自 运维开发王义杰 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
    • 2. 观察者模式的结构
      • 3. Go语言实现示例
        • 4. 观察者模式的应用场景
          • 5. 观察者模式的优缺点
            • 6. 结语
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档