##概要
あるオブジェクトへのアクセスを制御するため、共通のインタフェースを持つオブジェクトが代理をするパターン
以下の3種類のクラスからなる
- Proxyクラス(2.のインタフェースを実装)
- Subjectクラス(1,3の共通のインタフェースを定義)
- RealSubjectクラス(1.で共通化されていない2.のインターフェイスを実装)
##具体例と実装
飲食店の店長代理と店長の仕事を例にすると、
上記1~3はそれぞれ
- 店長代理クラス(ProxyStoreManagerクラス、重要な仕事以外は店長の仕事を代行する)
- 店長インターフェイスクラス(StoreManagerInterfaceクラス、店長の行う仕事を定義)
- 店長クラス(StoreManagerクラス、店長として仕事を行う)
が対応する。
コードの詳細は以下
proxy_store_manager.rb
class ProxyStoreManager < StoreManagerInterface
def instruct(staff)
# スタッフに指示を出す
end
def educate(staff)
# スタッフを教育する
end
def pay_salary(staff)
puts 'ちょっと待って'
# スタッフの給料を支払う権限はないので、店長に支払ってもらう
StoreManager.new.pay_salary(staff)
end
end
store_manager_interface.rb
class StoreManagerInterface
def instruct(staff)
end
def educate(staff)
end
def pay_salary(staff)
end
store_manager.rb
class StoreManager < StoreManagerInterface
def instruct(staff)
# スタッフに指示を出す
end
def educate(staff)
# スタッフを教育する
end
def pay_salary(staff)
# スタッフの給料を支払う
end
end
スタッフクラス、クライアントコード
class Staff
def initialize
end
end
staff = Staff.new
proxy_store_manager = ProxyStoreManager.new
proxy_store_manager.educate(staff)
proxy_store_manager.instruct(staff)
proxy_store_manager.pay_salary(staff)
##メリット
- あるオブジェクトへの要求があり次第オブジェクトを生成するといった最適化が行える
- RealSubjectが必要になるまでその生成を遅延することが出来るため、copy-on-writeが実装できる
##まとめ
- 複雑なオブジェクトのインスタンス1つと、それを代理可能な複数のプロキシオブジェクトを使い、必要なときにのみ複雑なインスタンスを生成、変更することで、メモリを節約することが出来る