23種軟件設計模式之觀察者模式,go語言實現

一.定義

觀察者模式定義:對象的一種一對多的依賴關係,當一個對象狀態變化時,所依賴它的對象得到通知並自動更新

二.應用場景

事件模型中的事件源與事件處理者

三.代碼

先看使用

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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章