かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

委譲してみよう

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

丸投げ成功〜!