package problem
|
|
import "fmt"
|
|
// Subject 主题接口
|
type Subject interface {
|
Register(observer Observer)
|
Deregister(observer Observer)
|
Notify(data interface{})
|
}
|
|
// Observer 观察者接口
|
type Observer interface {
|
Update(data interface{})
|
}
|
|
// BaseSubject 主题基类实现
|
type BaseSubject struct {
|
observers []Observer
|
}
|
|
func (s *BaseSubject) Register(observer Observer) {
|
s.observers = append(s.observers, observer)
|
}
|
|
func (s *BaseSubject) Deregister(observer Observer) {
|
for i, obs := range s.observers {
|
if obs == observer {
|
s.observers = append(s.observers[:i], s.observers[i+1:]...)
|
return
|
}
|
}
|
}
|
|
func (s *BaseSubject) Notify(data interface{}) {
|
for _, obs := range s.observers {
|
obs.Update(data)
|
}
|
}
|
|
//// 主题实现
|
//type ConcreteSubject struct {
|
// BaseSubject
|
//}
|
//
|
//// 观察者实现
|
//type ConcreteObserver struct {
|
// name string
|
//}
|
//
|
//func (o *ConcreteObserver) Update(data interface{}) {
|
// fmt.Printf("%s 收到通知:%v\n", o.name, data)
|
//}
|
//
|
//func main() {
|
// subject := &ConcreteSubject{}
|
//
|
// observer1 := &ConcreteObserver{name: "观察者1"}
|
// observer2 := &ConcreteObserver{name: "观察者2"}
|
//
|
// subject.Register(observer1)
|
// subject.Register(observer2)
|
//
|
// subject.Notify("新数据1")
|
// subject.Deregister(observer1)
|
//
|
// subject.Notify("新数据2")
|
//}
|
|
// 主题实现
|
type EventSubject struct {
|
BaseSubject
|
}
|
|
// 观察者实现
|
type EventObserver struct {
|
name string
|
}
|
|
func (o *EventObserver) Update(data interface{}) {
|
fmt.Printf("%s 收到通知:%v\n", o.name, data)
|
}
|