Java/Importance/デザインパターン/strategy

Last-modified: 2008-03-02 (日) 11:51:58

Strategyパターン

strategyパターンとは

プログラム中で処理方法がいくつか考えられる場合、その考えられるパターン部分の処理だけを交換できるようにするパターンを言います。実はこのパターンを適用できる場面が多々あると思います。設定値を取得するという処理があるとすると、設定値をファイルから読むパターンとデータベースなどから読むパターンなどがあげられると思います。また、あるデータ情報を保持する処理があるとすると一度にすべての情報を保持しておくパターンと保持している情報がなければ外部に取得して保持するパターン、毎回外部に取得しにいくパターンなどもあります。絶対にそのようなパターンは存在しないからわざわざstrategyパターンにしなくてよいというときもありますが、このパターンが適用できる場合は積極的に使用したほうがあとあとよかったという場面がよくありました。

サンプル

あるサービスにてユーザのチェックを行い登録されたユーザであれば処理を実行するプログラムを作成したとします。セキュリティを考えてユーザチェック部分は今後拡張できるように切り替えができるようにしたいという要求がありました。
この場合strategyパターンを適用すればうまく切り替えができます。

accept_strategy_exsample.png

開発時はAcceptAnyoneStrategyを使用してもらえれば後続処理はユーザチェック部分を考えずに実装してもらえます。またstrategy部分を使用しているクラスのユニットテストでもAcceptAnyoneStrategyを使用してもらえればよけいことを考えずに自分のユニットテスト部分に専念できます。システムテスト時にはAcceptUserCheckStrategyを使用してユーザチェックをすればよい今後の拡張についてもAcceptStrategyを実装したクラスを新たに作成してそれを使ってもらえれば大丈夫そうです。

ヒント

このstrategyパターンの最大の特徴は委譲というゆるい結合度を使用している点です。これによりシステムを柔軟に変更することが可能となります。システムばかりかユニットテスト時でもテストの作成を簡単にしてくれます。サンプルでも例を述べましたが、strategy(アルゴリズム)部分を切り離すことにより使用側のテストも簡単になります。インタフェースを作るということは基本的にコードの可読性を向上させますが、逆に可読性を減少させることにもなる場合があります。インタフェースを多用すると実装クラスへの参照を見つけるのが少し面倒です。いろいろなstrategyのどれが使用されているのかわからないこともよくあります。なのでクラス図や設計書などは必携といっていいでしょう(自分一人で開発している分にはいいですが・・・)。