導入
同じことをするにもいろんな方法があるものです。トンカツの添え物キャベツは千切りがよい人,
さて,
展開
Strategy (ストラテジ)
プログラムは何らかの目的があって作られます。目的を果たすためにアルゴリズムをコードに落とします。そのアルゴリズムは1つとは限りません。アルゴリズムによって処理速度の違いや効率の善し悪しがあります。あるデータに対して高速だったアルゴリズムが,
Strategyパターンの目的
Strategyという単語は,
目的のために使用できるアルゴリズムが複数あるとします。場合に応じてアルゴリズムを切り替えて使用できれば便利です。アルゴリズムを部品化して,
また,
[Strategyパターン]
主となるコードからアルゴリズムを表現するコードを切り離し,
上図のStrategyパターンでは,
アルゴリズムを実装したConcreteStrategyクラスは複数あります。ConcreteStrategyクラスはStrategyインタフェイスを実装しています。
ContextクラスはStrategyインタフェイスを通してConcreteStrategyクラスのメソッドstrategyMethodを使用します。Contextクラスのコードでは,
今後,
Strategyパターンを使わないと
同じ目的のために作られた,
同じ目的の異なるアルゴリズムを実装した複数のメソッドを,MultiAlgorithm.
)
void setup(){
int n = 10;
println("Sum of 1 to " + n + " is ...");
println("Switch algorithm.");
for ( int i = 0; i < n; i++ ){
int result = (i%2 == 0) ? sumSlow(n)
: sumFast(n);
println(i + " : sum(" + n + ") = " + result);
}
}
int sumSlow(int n){
println("<sumSlow>");
int val = 0;
for(int i=0; i <= n; i++){
val = val + i;
}
return val;
}
int sumFast(int n){
println("<sumFast>");
int val = n * (n+1) / 2;
return val;
}
アルゴリズムをクラスでカプセル化する
アルゴリズムを実装したメソッドを,
アルゴリズムをカプセル化したSlowSum
とFastSum
クラスのコードは紙面の都合上省略しますので,
条件判断文で使用するクラスを切り替える部分のコードNoStrategyPattern.
を参照)
void setup(){
int n = 10;
println("Sum of 1 to " + n + " is ...");
println("Switch algorithm.");
SlowSum ss = new SlowSum();
FastSum fs = new FastSum();
for ( int i = 0; i < n; i++ ){
int result = (i%2 == 0) ? ss.sum(n)
: fs.sum(n);
println(i + " : sum(" + n + ") = " + result);
}
}