前端之家收集整理的这篇文章主要介绍了
Just for fun——go实现一下观察者模式,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
package main
import (
"fmt"
)
type Subject interface {
RegisterObserver(o Observer)
RemoveObserver(o Observer)
NotifyAllObservers()
}
type Observer interface {
// 温度,湿度,气压
Update(temp float32,humidity float32,pressure float32)
}
type WeatherData struct {
Temperature float32
Humidity float32
Pressure float32
Observers map[Observer]bool
}
func NewWeathData() *WeatherData {
return &WeatherData{
Observers: make(map[Observer]bool),}
}
func (wd *WeatherData) RegisterObserver(o Observer) {
wd.Observers[o] = true
}
func (wd *WeatherData) RemoveObserver(o Observer) {
if _,ok := wd.Observers[o]; ok {
delete(wd.Observers,o)
}
}
func (wd *WeatherData) NotifyAllObservers() {
for o,_ := range wd.Observers {
o.Update(wd.Temperature,wd.Humidity,wd.Pressure)
}
}
func (wd *WeatherData) SetMeasurements(temp float32,pressure float32) {
wd.Temperature = temp
wd.Humidity = humidity
wd.Pressure = pressure
wd.NotifyAllObservers()
}
type CurrentConditionsDisplay struct {
Temperature float32
Humidity float32
weathData Subject
}
func NewCurrentConditionsDisplay(weathData Subject) *CurrentConditionsDisplay {
ccd := &CurrentConditionsDisplay{
weathData: weathData,}
weathData.RegisterObserver(ccd)
return ccd
}
func (ccd *CurrentConditionsDisplay) Update(temp float32,pressure float32) {
ccd.Temperature = temp
ccd.Humidity = humidity
// pressure 没用到
ccd.Display()
}
func (ccd *CurrentConditionsDisplay) Display() {
fmt.Println("Current conditions: " + fmt.Sprintf("%v",ccd.Temperature) + "F degrees and " + fmt.Sprintf("%v",ccd.Humidity) + "% humidity")
}
func main() {
weathData := NewWeathData()
_ = NewCurrentConditionsDisplay(weathData)
weathData.SetMeasurements(80,65,30.4)
weathData.SetMeasurements(82,70,29.2)
weathData.SetMeasurements(78,90,29.2)
}
测试
输出
Current conditions: 80F degrees and 65% humidity
Current conditions: 82F degrees and 70% humidity
Current conditions: 78F degrees and 90% humidity