golangでオブザーバーパターンを実装するコードの書き方
Go言語でオブザーバーパターンを実装するには、次の手順に従うことができます。
- Subjectインターフェースを定義する。このインターフェースは、メソッドを包含する。
type Subject interface {
Register(observer Observer) // 注册观察者
Unregister(observer Observer) // 取消注册观察者
Notify() // 通知观察者
}
- Observerインターフェイスを定義する、次のメソッドを含む
type Observer interface {
Update() // 观察者更新方法
}
- Subject構造体をSubjectインタフェースを実装する方法
type ConcreteSubject struct {
observers []Observer
}
func (s *ConcreteSubject) Register(observer Observer) {
s.observers = append(s.observers, observer)
}
func (s *ConcreteSubject) Unregister(observer Observer) {
for i, o := range s.observers {
if o == observer {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
break
}
}
}
func (s *ConcreteSubject) Notify() {
for _, observer := range s.observers {
observer.Update()
}
}
- Observerインターフェイスを実装するObserver構造体をインプリメントする方法。
type ConcreteObserver struct {
name string
}
func (o *ConcreteObserver) Update() {
fmt.Println(o.name, "received notification")
}
- オブザーバーパターンを使用する
func main() {
subject := &ConcreteSubject{}
observer1 := &ConcreteObserver{name: "Observer 1"}
observer2 := &ConcreteObserver{name: "Observer 2"}
subject.Register(observer1)
subject.Register(observer2)
subject.Notify()
subject.Unregister(observer1)
subject.Notify()
}
上のコードでは、ConcreteSubject は Subject インターフェイスを実装し、ConcreteObserver は Observer インターフェイスを実装します。Subject の状態が変更されると、登録済みの Observer 全体に更新を通知するために Notify メソッドが呼び出されます。main 関数では、ConcreteSubject オブジェクトを作成し、2 つの ConcreteObserver オブジェクトを登録します。次に、Notify メソッドを呼び出してすべての Observer に更新を通知します。最後に、observer1 の登録を解除し、再び Notify メソッドを呼び出します。このとき通知を受け取るのは observer2 のみです。