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

使用Go语言实现观察者模式

作者头像
运维开发王义杰
发布2023-08-10 19:29:30
1520
发布2023-08-10 19:29:30
举报

观察者模式是一种行为设计模式,当对象的状态改变时,它允许某些对象通知其他对象。这通常被用于实现事件处理系统。下面我们通过一个简单的天气监控系统来演示在Go语言中如何实现观察者模式。

首先,我们定义Observer(观察者)和Subject(主题)接口:

代码语言:javascript
复制
type Observer interface {
    Update(temperature float64, humidity float64, pressure float64)
}

type Subject interface {
    RegisterObserver(o Observer)
    RemoveObserver(o Observer)
    NotifyObservers()
}

然后,我们创建一个实现了Subject接口的WeatherData结构:

代码语言:javascript
复制
type WeatherData struct {
    observers   []Observer
    temperature float64
    humidity    float64
    pressure    float64
}

func NewWeatherData() *WeatherData {
    return &WeatherData{}
}

func (w *WeatherData) RegisterObserver(o Observer) {
    w.observers = append(w.observers, o)
}

func (w *WeatherData) RemoveObserver(o Observer) {
    for i, observer := range w.observers {
        if observer == o {
            w.observers = append(w.observers[:i], w.observers[i+1:]...)
        }
    }
}

func (w *WeatherData) NotifyObservers() {
    for _, observer := range w.observers {
        observer.Update(w.temperature, w.humidity, w.pressure)
    }
}

func (w *WeatherData) measurementsChanged() {
    w.NotifyObservers()
}

func (w *WeatherData) SetMeasurements(temperature float64, humidity float64, pressure float64) {
    w.temperature = temperature
    w.humidity = humidity
    w.pressure = pressure
    w.measurementsChanged()
}

接下来,我们创建一个实现了Observer接口的CurrentConditionsDisplay结构:

代码语言:javascript
复制
type CurrentConditionsDisplay struct {
    temperature float64
    humidity    float64
    weatherData Subject
}

func NewCurrentConditionsDisplay(weatherData Subject) *CurrentConditionsDisplay {
    c := &CurrentConditionsDisplay{weatherData: weatherData}
    weatherData.RegisterObserver(c)
    return c
}

func (c *CurrentConditionsDisplay) Update(temperature float64, humidity float64, pressure float64) {
    c.temperature = temperature
    c.humidity = humidity
    c.Display()
}

func (c *CurrentConditionsDisplay) Display() {
    fmt.Printf("Current conditions: %.2f F degrees and %.2f humidity\n", c.temperature, c.humidity)
}

最后,我们的客户端代码看起来像这样:

代码语言:javascript
复制
func main() {
    weatherData := NewWeatherData()

    NewCurrentConditionsDisplay(weatherData)

    weatherData.SetMeasurements(80, 65, 30.4)
    weatherData.SetMeasurements(82, 70, 29.2)
    weatherData.SetMeasurements(78, 90, 29.2)
}

运行这段代码,你会看到随着WeatherData的数据更新,CurrentConditionsDisplay的显示也相应的更新了。这就是观察者模式的应用,希望你能从中找到它的价值。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档