オブジェクト指向設計


State パターン - ステートパターン

2008/06/18 23:17Update
TAGS: State | GoF | デザインパターン | OOD | オブジェクト指向設計

StateパターンはGoFによる23種類のデザインパターンの振る舞いに関連するパターンの一つです。Stateパターンはオブジェクトの内部状態の変化に応じて振舞いも変えられるようにします。

Page:  <1|2>

概要


「オブジェクトの内部状態が変化される際、振る舞いも大きく変わる」、このような場合、Stateパターンを使ったほうがよいと考えられます。

例から説明します。
ペイントソフトウェアは「鉛筆」、「ブラシ」、「直線を描く」、「曲線を描く」などの描画ツールがあります。ユーザはそれぞれの描画ツールで異なる図形を描くことができます。

言い換えますと、次のようになります。
- 描画ツールはオブジェクトと考えられる
- 描画ツールの選択は そのオブジェクトの状態が変化されたことである
- 違う描画ツールの振る舞いも違う(直線ツールは直線を描く、曲線ツールは曲線を描く)
- 状態の変化に応じて、振る舞いが変わる

通常の方法だと、その実装方法は次のようになります。
//描画ツールの選択・イベント
public void onSelectPen(int state) {
    //選択された描画ツールによって、図形を描画する
    if (state == CIRCLE_PEN) {
        CirclePen cp = new CirclePen();    //円形ツール
        cp.drawCircle(paramters);    //円形を描画する
    } else     if (state == SQUARE_PEN) {
        SquarePen sp = new SquarePen();    //四角形ツール
        sp.drawSquare(paramters);    //四角形を描画する
    } else     if (state == LINE_PEN) {
        LinePen lp = new LinePen();
        lp.drawLine(paramters);
    }
    ...    //その他描画ツール
}


以上の方法だと、複数の条件分岐を使っています、よって、描画ツールの増減に伴い、ソースの修正もしなければなりません。

Stateパターンでは、状態を表す複数のクラスを抽象し、そしてWrapperクラスによってそれらの状態クラスを一元管理することで、状態の変化による振る舞いの改変をカプセル化します。

Stateパターンクラス図


<<クラス図>>


State
    状態・振る舞いの抽象クラス。
ConcreteState
    状態・振る舞いの具体的なクラス。Stateから継承。直線ツールや、鉛筆ツールなどはこれに該当します。
StateWrapper
    「状態」のラッパークラス、または「状態」のコンテナークラス。状態の変化に応じて振舞いを変化させます。

次のページ:State パターンの使用例
Page:  <1|2>

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments