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

こんにちは、KOUKIです。

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

デザインパターンまとめ

シチュエーション

State とは、「状態」を意味する英単語です。 Go言語に限らずあらゆるプログラミング言語は、モノ(車とか家とか)をクラスとして表現しますが、State パターンは、 モノではなく「状態」をクラスとして表現するパターンです。
※Go言語ではクラスは存在しないので、構造体やインターフェースがそれらを表現します。

インスタンスの状態によって、振る舞いを変えたい時に便利です。

Stateパターンの適用

PCのON/OFFの状態を、Stateパターンで表現してみましょう。

StateインターフェースとPC構造体

PCのON/OFFの状態を、次ように表現しました。

Stateインターフェースには、PC構造体をパラメータにもつOn/Off処理持ちます。

PC構造体は、Stateをパラメータとして持つので、On/Offを呼び出すことができます。

StandbyState

スタンバイ状態を構造体として定義します。

On/Off構造体

On/Off構造体を実装します。

PCコンストラクタとメソッド

On/Off構造体のメソッドには、状態を格納する処理(「pc.State = NewOffState()」/「pc.State = NewOnState()」)を入れています。

そのため、PC構造体から以下のようにしてOnState/OffStateのメソッドを呼び出すことができます。

PC構造体には、Stateインターフェースを実装したOnState/OffState構造体が格納されていて、それらのメソッドの引数としてPC構造体を渡しています。

ちょっとややこしいですね^^;

使ってみよう

ここまで実装したプログラムを使ってみましょう。

OKですね。

PCがOFF状態の時、更にOffメソッドを呼び出すと「Power is already off」が表示されました。これは、StandbyState構造体のOffメソッドが呼ばれたことを示しています

流れが少し複雑になっているので、整理してみましょう。

  1. NewPCコンストラクタで、PCインスタンスを生成 -> OffStateインスタンスも生成
  2. OffStateインスタンスのOnメソッド呼び出し -> OnStateインスタンスを生成し、PCインスタンスに格納
  3. OnStateインスタンスのOffメソッド呼び出し -> OffStateインスタンスを生成し、PCインスタンスに格納
  4. OffStateインスタンスのOffメソッド呼び出し -> StandbyStateインスタンスのOffメソッド呼び出し
  5. 以下略…

実は、OffState構造体にはOnメソッドを、OnState構造体には、Offメソッドを実装していません。その代わり、それぞれのプロパティにStandbyState構造体を持っており、このメソッドを参照しに行います。そのため、上記リストの4の挙動になります。

まとめ

Stateパターンは、もしかしたら実務では使わないかもしれませんね^^;

実践に適用できるイメージが湧きませんでした…. が、もう少し勉強してみてからその答えを出そうと思います。

それでは、また!

次回

次回も引き続き、Stateパターンを学習します。

Go言語まとめ

ソースコード

コメントを残す