戦略パターンとはインタフェースを間にクラスとクラスを連結する
コードのリサイクルを可能にするでデザインパターンの一つです。
Java、C ++などで活用されます。
サンプルコードを一度見ます。
それなりに模型も作ってみました。
import java.io.File;
import java.util.ArrayList;
public class Client {
public static void main(String[] args) {
CompressionContext ctx = new CompressionContext();
//we could assume context is already set by preferences
ctx.setCompressionStrategy(new ZipCompressionStrategy());
//get a list of files...
ctx.createArchive(fileList);
}
public static class CompressionContext {
private CompressionStrategy strategy;
public void setCompressionStrategy(CompressionStrategy strategy) {
this.strategy = strategy;
}
//use the strategy
public void createArchive(ArrayList<File> files) {
strategy.compressFiles(files);
}
}
public interface CompressionStrategy {
void compressFiles(ArrayList<File> files);
}
public static class ZipCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
public static class RarCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
}
順番に考えてみましょう。
プログラム開発中、圧縮機能が必要な状況が生じたと仮定します。
最初はrarで圧縮するコードを作り使いました。
しかし、後ほどzip圧縮が必要になり、7zip圧縮機能も使わなければならなくなりました。
一々拡張子のコードを作成すると、50以上のクラスが生じ、
圧縮のプロセスで共通の部分が大き出き、非効率的なコードになってしまいます。
こいう時、このデザインパターンを利用できます。
圧縮という一つのコンテキスト(Context)をずっと進行する途中
圧縮プロセスの一部分の拡張子の設定の問題が出来ました。
この拡張子の設定は、複数の戦略(Strategy pattern)のうち一つを選ぶことで問題が解決できます。
一つの戦略を選択し、残った圧縮のプロセスを進めます。
この戦略選択のプロセスは、一つに限りません。
脈絡(Context)が終わるまでの戦略の選択プロセスを繰り返して、
後には流れが終わって、圧縮が完了します。
このデザインパターンを使えばプログラマーは状況に合わせて柔軟に選択ができます。
個人的にモデルを作ってみました。
「会社で人材不足を解決の問題に陥った時を考えてみればいい比喩になるかも知れない!」
と思って作成みました。個人的に作ったものですので
あくまで参考用に使ってください。
댓글 없음:
댓글 쓰기