一.定义
观察者模式定义:对象的一种一对多的依赖关系,当一个对象状态变化时,所依赖它的对象得到通知并自动更新
二.应用场景
事件模型中的事件源与事件处理者
三.代码
先看使用
func main() {
fmt.Printf("this is a observer design pattern demo ...\n")
//创建被观察者也可以叫主题
hansenSubject := SubjectNew("Create")
//创建观察者
Observer1 := ObServerNew("Observer1")
Observer2 := ObServerNew("Observer2")
Observer3 := ObServerNew("Observer3")
//绑定观察者
hansenSubject.Binding(Observer1)
hansenSubject.Binding(Observer2)
hansenSubject.Binding(Observer3)
//通知所有观察者
hansenSubject.Notify("csdn-blog")
}
运行结果
[Create] subject notify [csdn-blog]event to [Observer1] observer
[Create] subject notify [csdn-blog]event to [Observer2] observer
[Create] subject notify [csdn-blog]event to [Observer3] observer
原理实现
//观察者
type ObServer struct {
Name string
}
//被观察者(主题)
type Subject struct {
Name string
obMap map[string]*ObServer
}
//收到通知做出更新事件处理
func (ob *ObServer) UpdateProc(su *Subject, event string) {
fmt.Printf("[%v] subject notify [%v]event to [%v] observer\n", su.Name, event, ob.Name)
}
//通知所有观察者
func (s *Subject) Notify(event string) {
for _, v := range s.obMap {
v.UpdateProc(s, event)
}
}
//删除观察者
func (s *Subject) Del(ob *ObServer) {
delete(s.obMap, ob.Name)
}
//绑定添加观察者
func (s *Subject) Binding(ob *ObServer) {
//添加观察者到map中
s.obMap[ob.Name] = ob
}
func ObServerNew(ObServerName string) *ObServer {
//new 一个对象
return &ObServer{
Name: ObServerName ,
}
}
func SubjectNew(subjectName string) *Subject {
//new 一个对象
return &Subject{
Name: subjectName,
obMap: make(map[string]*ObServer),
}
}
//go语言在线测试
//http://www.dooccn.com/go/