凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 215
  • 記事 - 0
  • コメント - 1274
  • トラックバック - 160
ニュース
  • 2008-04-01 *で始まるタイトルはエイプリルフールネタです
    2008-01-26 わんくま勉強会東京#16
    ライブプログラミング
    2007-12-08 わんくま勉強会名古屋#1
    「わんくま初めてのJava」
    2007-07-28 開店
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ

書庫

日記カテゴリ

 

Strategyパターンは条件分岐をOOP(オブジェクト指向)のポリモフィズムで表現したものです。 分岐数が限定される場合はJavaSE5.0からのenum(列挙型)と組み合わせることができます。

enumにStrategyのインスタンスを持たせる

Javaのenumはクラスの継承型を利用していますので、enumにフィールドやメソッドを持たせることができます。

public enum TestEnum {
  TypeA(new Strategy(){
    public void exec(){
      System.out.println("Strategy A");
    }
  }),
  TypeB(new Strategy(){
    public void exec(){
      System.out.println("Strategy B");
    }
  }),
  TypeC(new Strategy(){
    public void exec(){
      System.out.println("Strategy C");
    }
  }),
  // ;を記述することで、その後にenumのクラスの拡張を記述できる

  /** Strategyの保持フィールド */
  private final Strategy strategy;
  /** enumのコンストラクタ */
  private TestEnum(Strategy strategy) {
    this.strategy = strategy;
  }
  /** Strategyへの委譲 */
  public void exec() {
    this.strategy.exec();
  }

  /** Strategyパターンのインターフェース */
  static interface Strategy {
    void exec();
  }
}

このStrategyを受け取るメソッドはenumとして受け取るように作ります。

  /** Strategyをenumで引き渡す */
  public static void hoge(TestEnum strategy) {
    strategy.exec();
  }

このようにしておくとIDEの補完機能でメソッドに引き渡すenumの一覧が参照できます。 そもそも既定のenum以外は渡すことができません。

この手法はStrategyの種類が固定である場合、規定外のStrategyを作らせないという効果があります。 Strategyの種類を増やす場合にはenumの編集が必要になるので、自由な拡張ができないわけですが、 逆に自由に拡張させたくない場合に使うことができるわけです。

利用側はStrategyパターンなど理解していなくともフラグとしてenumを渡すだけでよいのです。 また、StrategyパターンというよりはStateパターンになりますが、この列挙の値そのものをフラグとして使う場合、 classのインスタンスを用いるよりも扱いが便利です。

このように静的な強い型付けを利用することで、クラスライブラリの利用者に誤った使い方をさせないように工夫することができます。

投稿日時 : 2008年5月20日 23:28
コメント
  • # re: Strategyのインスタンスをenumで扱う
    中博俊
    Posted @ 2008/05/20 23:53
    5からEnumできたんだ<遅
  • # re: Strategyのインスタンスをenumで扱う
    凪瀬
    Posted @ 2008/05/21 0:04
    出来てますよ~。
    ちなみに、Java1.4までだとTypesafe Enumパターンというデザインパターンを用いるのが通例でした。
    switch文で使えないなど利便性はJava5のenumに比べれば当然劣るわけですけどね…
  • # 自己言及するジェネリクス
    凪瀬 Blog
    Posted @ 2008/05/25 18:06
    自己言及するジェネリクス
タイトル  
名前  
Url
コメント