概要
サブシステム内に存在する複数のインターフェイスに一つの統合インターフェイスを与えるパターン
以下の2種類のクラスからなる
- Facadeクラス(クライアントからの要求をサブシステム内の適当なオブジェクトに委譲する)
- サブシステム内のクラス(サブシステムの機能を実装している)
具体例と実装
エスプレッソマシーンを例にすると、
上記はそれぞれ
- 全自動エスプレッソコーヒーメーカークラス(AutoEspressoCoffeeMakerクラス。Grinder、Stamper、Steamer、Dripperの各クラスに処理を委譲してコーヒーの作成を行う)
- 豆挽きクラス、スタンピングクラス、ドリップクラス(それぞれGrinder、Stamper、Dripperクラス)
が対応する。
コードの詳細は以下
auto_espresso_coffee_maker.rb
class AutoEspressoCoffeeMaker
  def make_coffee(coffee_bean, density, size)
    grinder = Grinder.new(density, size)
    stamper = Stamper.new(density, size)
    dripper = Dripper.new(size)
    grinded_bean = grinder.grind(coffee_bean)
    return dripper.drip(samper.stamp(grinded_bean))
  end
end
grinder.rb
class Grinder
  def initialize(density, size)
    @coffee_bean = coffee_bean
    @density = density
    @size = size
  end
  def grind(coffee_bean)
    # 濃度、サイズに応じて豆を挽く
  end
end
stamper.rb
class Stamper
  def initialize(density, size)
    @density = density
    @size = size
  end
  def stamp(grinded_bean)
    # 濃度、サイズに応じてスタンピングする
  end
end
dripper.rb
class Dripper
  def initialize(size)
    @size = size
  end
  def drip(stamped_bean)
    # サイズに応じてドリップする
  end
end
メリット
- クライアントがサブシステムを知らなくてよいため、クライアントが扱うオブジェクトが少なくなり、サブシステムの利用が容易になる
- サブシステム内のクラスを直接利用する必要がある場合の妨げにならない
まとめ
クライアントに対してシステムの複雑さを軽減し、サブシステムとクライアントの結合を弱めるパターン