golangでオブザーバーパターンを実装するコードの書き方

Go言語でオブザーバーパターンを実装するには、次の手順に従うことができます。

  1. Subjectインターフェースを定義する。このインターフェースは、メソッドを包含する。
type Subject interface {
    Register(observer Observer)    // 注册观察者
    Unregister(observer Observer)  // 取消注册观察者
    Notify()                       // 通知观察者
}
  1. Observerインターフェイスを定義する、次のメソッドを含む
type Observer interface {
    Update()  // 观察者更新方法
}
  1. 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()
    }
}
  1. Observerインターフェイスを実装するObserver構造体をインプリメントする方法。
type ConcreteObserver struct {
    name string
}

func (o *ConcreteObserver) Update() {
    fmt.Println(o.name, "received notification")
}
  1. オブザーバーパターンを使用する
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 のみです。

bannerAds