『Java言語で学ぶデザインパターン入門』をPHPで実習する State

増補改訂版Java言語で学ぶデザインパターン入門

本記事に掲載したサンプルコードは、https://github.com/ryo-utsunomiya/design_patternでも公開中です。

Stateとは

「状態」をクラスとして表現する方法です。複雑な条件文をリファクタリングする際などに使用されます。

ここでは、「昼」「夜」という状態を実装し、状態に応じて表示されるメッセージが変わるアプリケーションを実装します。

まずは、Stateのインタフェース。

doClockメソッドで使用しているContextInterfaceは、状態に応じた振る舞い(この例では、メッセージ出力)を行うオブジェクトのインタフェースです。定義は以下のようになります。

次に、昼を表すDayState

DayStateはSingletonで実装しています。これは、状態が変わる度に新しいインスタンスが生成されることを防ぐためです。また、isDayというメソッドを持っていて、渡された時刻が昼か夜かを判別します。

昼か夜かを判別する役割をどのクラスに持たせるかは悩みましたが、DayStateに持たせました。今回はオリジナルに準拠してStateをインタフェースにしていますが、抽象クラスを作って、これに昼か夜かを判別するメソッドを持たせるのが良いかもしれません。

次に、夜を表すNightState

次に、DayState・NightStateを使うSafe(金庫)クラスです(オリジナルではGUIを含んでいますが、PHPでGUIを作るのは大変なので割愛します)。

最後に、これらのクラスを使用するmain.phpです。

現在時刻の変化に応じて、Stateが自動的に切り替わります。状態が2つだけだと、ありがたみがわかりづらいですが、Stateパターンの強みは新しい状態の追加のような仕様変更に柔軟に対応できる、という点にあります。

コメントを残す