代码
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。