Strategy Pattern - Design Pattern in Ruby Chapter 5
まとめ
Templateパターンと同じ問題を解決するが、compositionとdelegateの形式で行う分、疎結合で柔軟な設計になる。
似たようなことを行うオブジェクト(family objects)をまとめ同じインターフェースを定義することで、使う側のオブジェクト(context object)から、簡単に入れ替えができるようになる。
rubyの場合、シンプルなStrategy patternはProcオブジェクトベースで実現できる。
Strategyパターンを用いるときに注意することは、contextとstrategyのインターフェース。
1つ目のstrategyオブジェクトを複雑にタイトに連携したインターフェースにしてしまうと、それ以降のstrategyオブジェクトをうまく扱えなくなってしまう。
ProcベースのStrategy Patternの実施
Array#bubble_sort!のオーダー順をProcベースのStrategy Patternで実装してみた。
class Array def bubble_sort! (&ordering) (self.size - 1).times do for i in 0...(self.size - 1) if ordering.call(self[i], self[i + 1]) > 0 tmp = self[i + 1] self[i + 1] = self[i] self[i] = tmp end end end end end array = [1, 3, 10, 9] array.bubble_sort! {|a, b| a <=> b} # [1, 3, 9, 10] array.bubble_sort! {|a, b| b <=> a} # [10, 9, 3, 1]