代码
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, humidity 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, humidity 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