Design Patterns in RubyでStrategyパターンを学んだ

Design Patterns in Ruby でStrategyパターンを学んだ。自分用のメモとして残しておく。

Design Patterns in Ruby (Adobe Reader) (Addison-Wesley Professional Ruby Series) (English Edition)

Design Patterns in Ruby (Adobe Reader) (Addison-Wesley Professional Ruby Series) (English Edition)

  • 作者:Russ Olsen
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2007/12/10
  • メディア: Kindle版

オブジェクトによって処理は異なるがインターフェースが等しいときStrategyパターンで複雑さを取り除くことができる。

Strategyパターンと同じ問題を解決する手法としてTemplate Methodパターンがある。Template Methodは、継承で問題を解決するため親クラスの情報を引き継いでしまうという欠点がある。

Strategyパターンは、継承の代わりに委譲でアルゴリズムの複雑性を隠蔽する。

以下に簡単なStrategyパターンの例を示す。

class Payment
  def initialize(platform)
    @platform = platform
  end

  def purchase
    @platform.purchase(self)
  end
end

module Platform
  class AppStore
    TARGET_URI = "https://app.store".freeze
    def purchase(context)
      puts "Purchase Service on App Store and process complex tasks"
    end
  end
end

module Platform
  class GooglePlay
    TARGET_URI = "https://google.play".freeze
    def purchase(context)
      puts "Purchase Service on Google Play and process complex tasks"
    end
  end
end

Strategyパターンの利点と欠点

  • サブクラスでなく委譲である
  • 条件文を排除できる
  • 同じ振る舞いに対して異なる実装を提供できる
  • クライアントは、各Strategyの実装を知っている必要がある
  • Contextの情報を全く利用しないStrategyが存在する

参考文献

マンガでわかる Strategy