文章目錄
- 1. 概念
- 1.1 角色
- 1.2 類圖
- 2. 代碼示例
- 2.1 代碼
- 2.2 類圖
1. 概念
觀察者(Observer)指當目標對象狀態發生變化后,對狀態變化事件進行響應或處理的對象。
1.1 角色
- Subject(抽象主題):
- 它可以有多個觀察者,并將所有觀察者對象的引用保存在一個集合里
- 被觀察者提供一個接口,可以增加和刪除觀察者角色
- ConcreteSubject(具體主題):
- 將有關狀態存入具體觀察者對象
- 在主題發生改變時,給所有的觀察者發出通知
- Observer(抽象觀察者):
- 為所有的具體觀察者定義一個更新接口,在收到主題的通知時能夠及時的更新自己
- ConcreteObserver(具體觀察者):
- 實現抽象觀察者角色定義的更新接口,以便使本身的狀態與主題狀態相協調。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。
1.2 類圖
2. 代碼示例
2.1 代碼
- 代碼
package mainimport "fmt"//定義抽象主題,它是觀察者的聚合
type Subject struct{ observers []Observer
}//定義一個方法,為抽象主題添加觀察者
func (c *Subject) Attach(o ...Observer) {c.observers = append(c.observers, o...)
}//定義實際主題,繼承抽象主題,它是實際的被觀察者。
type ConcreteSubject struct {Subject Subjectcontext string}//依次通知觀察者
func (c *ConcreteSubject) notify() {for _, o := range c.Subject.observers {o.Update(c)}}//具體抽象主題的,同時發送通知給觀察者
func (c *ConcreteSubject) UpdateContext(context string) {c.context = contextc.notify()
}//定義抽象觀察者
type Observer interface {Update(*ConcreteSubject)
}//定義具體觀察者
type ConcreteObserverA struct {name string
}//更新觀察者
func (r *ConcreteObserverA) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} //定義具體觀察者
type ConcreteObserverB struct {name string
}//更新觀察者
func (r *ConcreteObserverB) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} //定義具體觀察者
type ConcreteObserverC struct {name string
}//更新觀察者
func (r *ConcreteObserverC) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} func main() {//實例化抽象主題subject := Subject{observers: make([]Observer, 0),}//實例化3觀察者concreteObserverA := &ConcreteObserverA{name: "concreteObserverA",}concreteObserverB := &ConcreteObserverB{name: "concreteObserverB",}concreteObserverC := &ConcreteObserverC{name: "concreteObserverC",}//將3個觀察者加入抽象主題subject.Attach(concreteObserverA,concreteObserverB,concreteObserverC)//實例化具體主題concreteSubject := &ConcreteSubject{Subject: subject,}//更新具體主題,它將通知所有觀察者concreteSubject.UpdateContext("updata context")
}
- 輸出
concreteObserverA receive "updata context"
concreteObserverB receive "updata context"
concreteObserverC receive "updata context"