Web アプリを書いていてよく使うデザインパターン(Composite パターン)

  • DB に日々のブックマーク数を保存している
  • 指定した期間のブックマークの日別の数を表示
  • ヘッダには指定した期間のブックマークの合計を表示

というような場合を想定。
このような場合は、DB から取ってきた結果をComposite パターンを使った箱に入れると便利。


このくらいの用途だと「sum すればいいじゃん」という話になるけれど、

  • 複数のテーブルからデータを取ってきた結果をComposite に入れて、ひとつのオブジェクトにまとめられて便利
  • Component とComposite の統一インターフェース(上の例ではCounts#count, Count#count)を持てるので、ポリモーフィズムを利用しやすい
  • 入れ物に集計機能がついているので、DB 以外にmemcached から取得した結果に対して使えたりできる

等の利点はあるかなと思います。
また、Composite パターンはruby と相性がいいかなーと思っていて、上の例のCounts に次のようなeach を実装してあげてEnumerable をinclude してあげるとか。で、Counts#each で指定した期間の日付順にCount を取得できるようにするとかできる。

class Counts
  include Enumerable

  def each
    @counts.values.each{|c| yield(c) }
  end
end