LoginSignup
3
2

More than 5 years have passed since last update.

【デザインパターン】 Proxyパターン

Last updated at Posted at 2015-08-09

概要

あるオブジェクトへのアクセスを制御するため、共通のインタフェースを持つオブジェクトが代理をするパターン

以下の3種類のクラスからなる
1. Proxyクラス(2.のインタフェースを実装)
2. Subjectクラス(1,3の共通のインタフェースを定義)
3. RealSubjectクラス(1.で共通化されていない2.のインターフェイスを実装)

具体例と実装

飲食店の店長代理と店長の仕事を例にすると、
上記1~3はそれぞれ

  1. 店長代理クラス(ProxyStoreManagerクラス、重要な仕事以外は店長の仕事を代行する)
  2. 店長インターフェイスクラス(StoreManagerInterfaceクラス、店長の行う仕事を定義)
  3. 店長クラス(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つと、それを代理可能な複数のプロキシオブジェクトを使い、必要なときにのみ複雑なインスタンスを生成、変更することで、メモリを節約することが出来る
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2