Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [⑩ Strategy]

概要

strategyは日本語で「戦略」という意味になる.Strategyパターンは,アルゴリズムの集合を定義し,各アルゴリズムをカプセル化して互いに入れ替え可能にするパターンである.

Strategyパターンの主な要素は以下である.

  • Strategy:サポートするすべてのアルゴリズムに共通したインターフェース
  • ConcreteStrategy:Strategyで定義されたインターフェースのアルゴリズムを実装するクラス
  • Context:Strategyオブジェクトを利用するクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

java// Strategy
interface Strategy {
    public void execAlgorithm();
}

// Concrete Strategy
class ConcreteStrategyA implements Strategy {
    @Override
    public void execAlgorithm() {
        System.out.println("ConcreteStrategyA execAlgorithm");
    }
}

class ConcreteStrategyB implements Strategy {
    @Override
    public void execAlgorithm() {
        System.out.println("ConcreteStrategyB execAlgorithm");
    }
}

// Context
class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void exec() {
        strategy.execAlgorithm();
    }
}

// Client
public class StrategyPattern {
    public static void main(String[] args) {
        Strategy strategyA = new ConcreteStrategyA();
        Strategy strategyB = new ConcreteStrategyB();
        Context contextA = new Context(strategyA);
        Context contextB = new Context(strategyB);
        contextA.exec();
        contextB.exec();
    }
}

まとめ,所感

オブジェクトのアルゴリズム(振る舞い)だけを変えるケースは想像しやすい.例えば,クレジットや現金といった支払い方法の切り替えなどがある.

同じ様なことはTemplate Methodでも実現できる.Template Methodとの違いは,Template Methodだとオブジェクトのプロパティを扱いやすいのに対して,Strategyだとあくまで部外者的立場にあるので,オブジェクトのプロパティは扱いにくい.

部分的な違いか,オブジェクト全体に及ぶ違い化でTemplate MethodとStrategyを使い分けるといいだろう.