【オブジェクト指向のこころ】9章 Strategyパターン

デザインパターンとともに学ぶオブジェクト指向のこころ」の学習記録。
「第9章 Strategyパターン」のまとめ。


Strategyは戦略という意味。
流動的要素をカプセル化し、交換可能なものにする方法。

適用例

SalesOrder(注文)クラスは税金の計算処理の機能を備えている。

http://www.plantuml.com/plantuml/png/SoWkIImgAStDuIhEpimhI2nAp5L8paaiBdOiAIdAJ2ejIVLCpiyBpgnALJ3WoiXCILL8pIqegLJ8JSrDIYqgvk82ArPmpibCpIjHgEQgXOa49-Qa5liNfQGM0KMranDpaaCIApGqWGhoyajI5OeoqpDAh1GUDorwtBpmSVEgnqsh7pUkUxwYxsNxnCTDavvrRdpSsCR5nGKrMCyEoK0kXzIy5A2J0G00

アプリケーションが完成した後、税金の取り扱いを変える必要があった。

継承を利用した例

http://www.plantuml.com/plantuml/png/SoWkIImgAStDuIhEpimhI2nAp5L8paaiBdOiAIdAJ2ejIVLCpiyBpgnALJ3WoiXCILL8pIqegLJ8JSrDIYqgvk82ArPmpibCpIjHgEQgXOa49-Qa5liNfQGM0KMranDpaaCIApGqWGhoyajI5OeoqpDAh1GUDorwtBpmSVEgnqsh7pUkUxwYxsNxnCTDavvrRdpSs0OtFJ4lCIKpCOyuCq56DNSzRcx0PY3KeNfsI0xaGZBNfaPN5ujzN0wfUId0K080

この方法の問題は以下のようなものがある。

  • 更にドイツを扱う場合どうするか?どのクラスを継承するか?
  • 他の流動的要素(例えば、日付フォーマット、言語、送料)が発生したらどうするか?
  • カナダの地域内でこれらが変化する場合はどうするか?

それでも無理やり継承で実装すると深い継承改装ができ、凝縮度が低く理解しにくいコードとなっていく。

Strategyパターンを適用した例

流動的な要素をカプセル化し、集約させる。
更に流動的な要素があれば、同様に集約させれば良い。
テストもアルゴリズム毎に行えるようになる。

http://www.plantuml.com/plantuml/png/VO-_IWD14CRxUOef4oHY7KGIhAmipZp0tDsGBExkXTqvIDGK6qG5HT16BEolyXLyc1MZR-7fvK90i1j-VFFz6NWX9wNHu4-LdP8ZWvacxuSYJgMby55Ms4ITCUx1HEMCRAOoHyCcPUS1ViLug1LRmNDOj2GXpVxOvUngkfEHpaverkdM0bi8erFZYVHnLTr_NJzyLZUhrwSOgXWkOxXAn97mU1wNZ-zlBnzt8ORdkBm5eDIBeqnm7TgO_lWBpOQcAArqkjZ7l2XJpVz4jIL7IVE_sEmWko7hJRi7srjWwovwlRO3j5tsBseuIlwWnXW6RFFIw6y0

※他の本やWebの情報ではStrategyはInterfaceとしているものが多い。

問題領域の分析を行い、時と場合に応じて使い分ける複数の業務規則を洗い出せた際は、Strategyパターンの使用可否を考えるようにするのが良い。