一.定義
觀察者模式定義:對象的一種一對多的依賴關係,當一個對象狀態變化時,所依賴它的對象得到通知並自動更新
二.應用場景
事件模型中的事件源與事件處理者
三.代碼
先看使用
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/