觀察者模式
定義
一系列對象之間的一對多的關係,當一個對象改變狀態時,它的所有依賴者都會收到通知。原理是觀察者訂閱被觀察者,如果被觀察者狀態變化,通知訂閱的觀察者。
角色
- 被觀察者
- 被觀察者訂閱抽象接口
- 觀察者結構體實現訂閱接口
角色關係爲:觀察者實現被觀察者抽象的訂閱接口,觀察者訂閱被觀察者,被觀察者一旦數據狀態改變,就通知調用訂閱者訂閱的抽象接口。
例子
一個公司業務部門接到業務需求後,產品、開發、測試觀察到需求後做不同的事情。即公司業務部門爲被觀察者,產品、開發、測試爲訂閱者。
-
定義業務部門即被觀察者
type Business struct{ Task string SubscribeList []Subscribe //訂閱列表 } //訂閱任務 func (b *Business)SubscribeJob(job Subscribe){ b.SubscribeList = append(b.SubscribeList,job) } //發佈任務 func(b *Business)ReleaseJob(){ for_,job :=range b.SubscribeList{ job.ReceiveJob() } }
-
定義業務部門發佈需求的抽象接口
type Subscribe interface{ ReceiveJob() }
-
定義觀察者結構體
//開發 type Developer struct{ } func (d *Developer)ReceiveJob(){ fmt.Println("develop job") } //產品 type Producter struct{ } func (p *Producter)ReceiveJob(){ fmt.Println("Product job") } //測試 type Tester struct{ } func (t *Tester)ReceiveJob(){ fmt.Println("test job") }
-
使用
func main(){ //定義被訂閱主體 b := &Business{} //訂閱 b.SubscribeJob(&Developer{}) b.SubscribeJob(&Producter{}) b.SubscribeJob(&Tester{}) //發佈 b.Task = "new task" b.ReleaseJob }
總結
抽象經常變動的訂閱者,並通過註冊的方式向被訂閱者註冊,被訂閱者保存訂閱者訂閱的抽象接口,一旦被訂閱者數據狀態改變,然後調用註冊的接口。