[Go言語]Observerパターンを学ぼう!

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるObserverパターンについて紹介します。

デザインパターンまとめ

シチュエーション

Observer は、「観察者」を意味する英単語です。

Observer パターンとは、インスタンスの変化(例えば、リストが追加されるなど)を観察することを目的としたもので、インスタンスの観察(どちらかというと通知?)を得意とするパターンです。

Observerパターンの実装イメージは、Pub/Subサービスです。Pub/Sub サービスとは、メッセージの送信者とメッセージの受信者を切り離す方式のメッセージ サービスのことを指します。

Google サイトより

Observerパターンの適用

簡単なサンプルコードを実装して、Observerパターンについて学習しましょう!

Observer and Observable

Observerインターフェース

いきなりですが、Observerパターンのコアの部分を実装します。

Observable構造体

Subscriptionを担う構造体を実装します。

人生で初めて使ったのですが、container/listパッケージのList構造体が結構便利です。

このObservable構造体は、以下のメソッドを持ちます。

Publisher構造体

次に、Publisher構造体を定義しましょう。

Observableを含めるところがポイントです。

これで、Subscriptionが使えます。

Publisher構造体には、次のメソッドを実装します。

サービスの実装

Pub/Subサービスで配信するサービスをいくつか実装してみましょう。

Observerインターフェースを実装したサービス構造体を用意することがポイントです。
※Go言語では、インターフェースに定義したパラメータ(Notify)をメソッドとして実装すれば、インターフェースを実装したとみなします

使ってみよう

ここまで実装したコードを使ってみましょう。

プログラムを実行します。

OKですね。

Property Observers

ある条件下において、Subscribeしたくない場合もあります。それを制御する構造体を実装しましょう。

PropertyChange構造体

このKeyには条件の名称を、Valueには実際の値を格納します。

Publisher構造体の修正

Publisher構造体に、対象年齢を示す「age」プロパティを追加します。

Publisherに対象年齢を付けました。

この構造体に、Getter/Setterを実装します。

サービスの実装2

以下のサービスを実装しましょう。

先ほどと違って、プロパティにObservableを持ちました。

このサービスのNotify処理を実装します。

今回は、TopicメソッドとSetAgeメソッドからFire -> Notifyメソッドを呼ぶことになるので、switch文でcase分けしています。

AdultServiceは、20歳以上の大人限定のサービスなので、もし年齢がそれに満たない場合は、Unsubscribeしています。

使ってみよう2

ここまで実装したコードを使ってみましょう。

OKですね。

Property Dependencies

PropertyChange構造体は結構便利です。

以下のように実装することもできます。

年齢制限チェク用のメソッドを実装

SetAgeメソッドの修正

Notifyメソッドを修正

使ってみよう3

OKですね。

まとめ

Observerパターンは、コンテンツ配信サーバーなどの自作サーバーを作る時に活躍してくれそうなパターンですね。

しかし、正しく理解して実装しないと、けっこうなバグを生み出すプログラムを書きそうで怖くもあります^^;

精進あるのみ! ですね。

それでは、また!

Go言語まとめ

ソースコード

Observer and Observable

Property Observers

Property Dependencies

コメントを残す