組立、組織、合成。 複数の部品を組み合わせ、単に部品を集合させた以上の効果を生み出す。 個々の部品をシンプルに保つことで、構成されたオブジェクト自身をシンプルに保つことができ、 各部品は理解・再利用・テストしやすくなることが期待される。 反面、全体としてアプリケーションの複雑性は増すこととなる。
- 音楽は複数の旋律の組み合わせから構成される。
- 自転車は複数の部品の組み合わせから構成される。
全てのメソッド呼出に対して何らかの処理を行うようなオブジェクトを生成したいとき、Rubyだと直接そういうオブジェクトを生成するようなクラスは用意されていないが、BasicObjectとmethod_missingを利用すれば簡単に作成できる。例えば、渡したloggerの全ての出力にタグを付けて欲しい場合にこの方法で解決しようとすると、こういう感じになる(この問題に対してのGoodな解決方法では無いです)。
class TaggingProxy < BasicObject
def initialize(target)
@target = target
end
def method_missing(name, message, *args, &block)
require "mac-event-monitor" | |
monitor = Mac::EventMonitor::Monitor.new | |
monitor.add_listener(:key_down) do |event| | |
system("afplay #{ENV['HOME']}/bin/sounds/#{event.keycode % 14 + 1}.wav &") | |
end | |
monitor.run |