デザインパターン学習メモ:「Strategy」


目的

GoF本より引用する。

アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを交換可能にする。Strategyパターンを利用することで、アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる。

Stateパターンとよく似ている。
http://qiita.com/mokrai/items/2caf83112c4b92d2ebe7

実装例

3つの数の足し算を行う。二つの計算アルゴリズムを用意する。一つは普通に掛け算する方法。もう一つは、足し算をループして非効率的に計算する方法。

MultiplicationContext.java
// Context役
public class MultiplicationContext {
    private Multiplication strategy;

    public MultiplicationContext(Multiplication stratagy) {
        this.strategy = stratagy;
    }

    public int calculate(int l, int m, int n) {
        return strategy.calculate(l, m, n);
    }
}
Multiplication.java
// Strategy役
// 掛け算をする
public interface Multiplication {
    int calculate(int l, int m, int n);
}
NomalMultiplication.java
// ConcreteStrategy役
public class NomalMultiplication implements Multiplication {

    // ふつうに計算する
    @Override
    public int calculate(int l, int m, int n) {
        return l * m * n;
    }
}
MultiplicationByAddition.java
//ConcreteStrategy役
public class MultiplicationByAddition implements Multiplication {

    // 足し算のループで非効率な計算
    @Override
    public int calculate(int l, int m, int n) {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            int intermediateResult = 0;
            for (int j = 0; j < m; j++) {
                intermediateResult += l;
            }
            sum += intermediateResult;
        }
        return sum;
    }
}

実行例

Main.java
public class Main {
    public static void main(String[] args) {
        MultiplicationContext contextA = new MultiplicationContext(new NomalMultiplication());
        int resultA = contextA.calculate(200,300,400);
        System.out.println(resultA);

        MultiplicationContext contextB = new MultiplicationContext(new MultiplicationByAddition());
        int resultB = contextB.calculate(200,300,400);
        System.out.println(resultB);
    }
}
結果
24000000
24000000

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ