デザインパターン-Decorator

Decoratorパターンとは

Decoratorパターンは、機能を追加する際に、既存のオブジェクトに対して修正を加えることなく、「Decorator(装飾者)」役のクラスを追加して飾り付ける(Decorate)ことで機能追加を実現するパターンです。

オブジェクトに「機能という名の装飾」を施していくことで、要求にあうオブジェクトに仕立て上げていきます。

なお、「Decorator」は、「装飾者」という意味の英単語です。


Decoratorパターンの例

「人間」クラスがあり、これを継承した「少女」クラスを考えます。

このクラスの「説明」というメソッドを使用すると、「少女です」という説明を表示します。

ここで、少女にドレスを着せて説明を「ドレスを着た少女です。」と表示するには、「少女」クラスを変更すれば可能です。

しかし、そうした場合には、全ての少女にドレスを着せることとなってしまいます。

ドレスを着た少女クラスと、普段着の少女クラスに分けるということも可能ですが、靴など他の装飾品を身につけた説明を追加することを考えると実用的ではありません。

装飾品を「Decorator」クラスとして機能追加することで、「ドレス」クラスや「靴」クラスなどを作成して組み合わせることで、効率的に複数の説明ができるようにします。


Decoratorパターンの利点

  • 元のクラスの中身を変えることなく、機能を追加することが出来る。
  • 組み合わせで様々な機能を実現できる。

構成要素

  • Component(部品)
    • 機能追加の核となるクラスです。
    • 機能拡張するメソッドのインタフェースを定義します。
  • ConcreteComponent(具体的な部品)
    • 基本機能を実装します。
    • 「Component」のインタフェースを実装します。
  • Decorator(装飾者)
    • 「Component」を実装しているオブジェクトを保持します。
  • ConcreteDecorator(具体的な装飾者)
    • 「Decorator」のインタフェースを実装します。

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


#!/usr/bin/env ruby

# Component(部品)
class Human
  def description; end
end

# ConcreteComponent(具体的な部品)
class Girl < Human
  def description;
    return("少女です。")
  end
end

# Decorator(装飾者) 
class Wear < Human
  def description; end
end

# ConcreteDecorator(具体的な装飾者) 
class WearWhiteDress < Wear
  def initialize(obj)
    @obj = obj
  end
  def description;
    return("白いドレスを着た" + @obj.description)
  end
end

# ConcreteDecorator(具体的な装飾者) 
class WearHighHeels < Wear
  def initialize(obj)
    @obj = obj
  end
  def description;
    return("ハイヒールを履いている" + @obj.description)
  end
end

# 装飾を纏います。
c = WearHighHeels.new(WearWhiteDress.new(Girl.new))
puts(c.description)


関連ページ