shimgo
4/9/2016 - 9:31 AM

Forwardable を使った Delegateパターン

Forwardable を使った Delegateパターン

require 'forwardable'

class DelegateTarget
  def method_1
    p 'target_1 called'
  end

  def method_2
    p 'target_2 called'
  end

  def method_3
    p 'target_3 called'
  end

  def method_4
    p 'target_4 called'
  end

  def self.class_method
    p 'Class method called'
  end
end

class Foo
  extend Forwardable

  # method_1をfoo_method_1として定義して処理は@target.method_1に委譲する
  def_delegator :@target, :method_1, :foo_method_1

  # メソッド名は変えずに委譲するメソッドを複数定義
  def_delegators :@target, :method_2, :method_3

  # クラスメソッドにも委譲できるがFooのクラスメソッドにはならずインスタンスメソッドになる
  def_delegator DelegateTarget, :class_method

  def initialize(target)
    @target = target
  end

  def method_4
    p 'Foo process'
    @target.method_4
  end
end

foo = Foo.new(DelegateTarget.new)
foo.foo_method_1
foo.method_2
foo.method_3
foo.method_4
foo.class_method