かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

委譲してみよう

sendとmethod_missingをつかって委譲(丸投げ)するクラスを作ってみた。
Adapterパターンとかが簡単に出来そうだ。

丸投げクラス

class Marunage
    def initialize(target, map = {})
        @target = target
        @map = map
    end
    
    def method_missing(method, *args, &block)
        target_method = @map[method]
        unless target_method
            target_method = method
        end
        @target.send(target_method, *args, &block)
    end
end
  • コンストラクタ
    • 丸投げ先のオブジェクト
    • 丸投げ時のメソッドの関連付けマップ
  • method_missing
    • 丸投げ時の関連付けマップから丸投げ先のメソッドを探す
    • 丸投げ時の関連付けが無かったら同じ名前のメソッドを呼ぶようにする
    • 丸投げ先のメソッドを呼ぶ

こんな流れ。


実際に使うときは以下のようになる

# say_helloメソッドが呼ばれたら,print_helloに丸投げする
m = Marunage.new(Printer.new, {:say_hello => :print_hello})

# さぁ!丸投げしてくれ!
m.say_hello

実行結果

Hello world

丸投げ成功〜!