デザインパターン-Mediator

Mediatorパターンとは

Mediator(メディエーター)パターンとは、多数のオブジェクト(同僚=Colleague)を利用する処理において、オブジェクト同士が互いに参照し合うことがないように、仲介役(Mediator)となるオブジェクトを介して制御を行うパターンです。

複雑に絡み合った複数のオブジェクト間の関係を、必ず「仲介者」を介して処理を行う様にすることで、適切な調整を行いながら処理を進めることが可能となります。

「Mediator」とは「仲介者・まとめ役」を意味します。


Mediatorパターンの利点

  • オブジェクト同士の依存関係を削減し、結合の度合いを下げることができる。
  • オブジェクトで重複する処理を持たせずに一か所で管理することで保守性を向上させる。
  • オブジェクト(メンバー)の追加が容易になります。

構成要素

  • Mediator(仲介者)
    • 「Colleague」からの相談受付の窓口インタフェースを定義します。
  • ConcreteMediator(具体的な仲介者)
    • 「Mediator」のインタフェースを実装します。
    • 「Colleague」からの相談を引受け、判断を下して指示を返します。
  • Colleague(同僚)
    • 他の「Colleague」を制御したい場合は、「Mediator」に相談します。
  • ConcreteColleague(具体的な同僚)
    • 「Colleague」のインタフェースを実装します。
  • Client(利用者)

rubyによるMediatorパターンの実装


#!/usr/bin/env ruby

# 仲介者インタフェース
class Mediator
  def create_colleagues
  end
  def consultation
  end
end

# 具体的な仲介者
class ConcreteMediator < Mediator
  def initialize
    @colleague = Hash.new
  end

  # 同僚を登録する
  def create_colleagues(colleague)
    @colleague.store(colleague.get_name,colleague)
  end

  # 仲介する
  def consultation(colleague, to, msg)
    puts("[mediator] from #{colleague.get_name} to #{to}")
    @colleague[to].read_msg(msg)
  end
end

# 同僚インタフェース
class Colleague
  def initialize(name)
    @name = name
  end

  def get_name
    return(@name)
  end

  def set_mediator(mediator)
    @mediator = mediator
  end
end

# 具体的な同僚1
class ConcreteColleague1 < Colleague
  def initialize(name)
    super(name)
  end

  def twitter(to, msg)
    @mediator.consultation(self, to, msg)
  end

  def read_msg(msg)
    puts("#{@name} received: #{msg}")
  end
end

# 具体的な同僚2
class ConcreteColleague2 < Colleague
  def initialize(name)
    super(name)
  end

  def twitter(to, msg)
    @mediator.consultation(self, to, msg)
  end

  def read_msg(msg)
    puts("#{@name} received: #{msg}")
  end
end

# Client
mediator = ConcreteMediator.new
user1 = ConcreteColleague1.new("user1")
user2 = ConcreteColleague1.new("user2")

# mediatorに登録する
user1.set_mediator(mediator)
user2.set_mediator(mediator)
mediator.create_colleagues(user1)
mediator.create_colleagues(user2)

# 同僚に連絡する
user1.twitter("user2", "I am user1.")
user2.twitter("user1", "I am user2.")


関連ページ