Rubyによるデザインパターンまとめ : Proxy
- 作者: Russ Olsen,ラス・オルセン,小林健一,菅野裕,吉野雅人,山岸夢人,小島努
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
- 購入: 13人 クリック: 220回
- この商品を含むブログ (66件) を見る
利用する場面
あるオブジェクトに関してアクセス制御などを行うとき、本体とは異なる代理のオブジェクトにその責務を引き受けさせる。
サンプル
class Locker def initialize @items = [] end def check(item) @items << item end def pickup(item) @items.delete(item) end end class LockerProxy def initialize(locker, password) @locker = locker @password = password end def check(item) @locker.check(item) end def pickup(item) while true do case gets.chomp when "exit" return when @password return @locker.pickup(item) else p "wrong password" next end end end end
> my_locker = LockerProxy.new(Locker.new, "1234") > my_locker.check(:baggage) > my_locker.pickup(:baggage) 2345 # => "wrong password" 1234 # => :baggage
proxyに限らないが、全面的に委譲したいときにはmethod_missingをつかうといい。 例えば上記のLockerProxy#checkなどの単なる(インターフェースが全く変わらない)委譲メソッドを書く代わりに、以下のようにすれば1つのメソッドでことが済む。
def method_missing(name, *args) @locker.send(name, *args) end
その他
- drb(Distributed Rubyパッケージ)をつかった例も試してみて、おお!ってなった。
- adapterはインターフェースを変更する←→proxyはインターフェースを変更しない
- decoratorはレイヤ状にチェーンする←→proxyはチェーンしない