Decorator

decorator.png
pink.png
装飾品をオブジェクトにする。
たとえば、スターバックスでいうと、ホイップが装飾にあたる。
装飾オブジェクトで飲み物オブジェクト(コーヒー)をラップする。
  • でこれーたは装飾するオブジェクトと同じスーパータイプを持つ。
  • 複数のでこれー他を使用してオブジェクトをラップできる。
  • でこれーたは装飾するオブジェクトと同じスーパータイプを持つので、元の(ラップされた)オブジェクトの代わりに装飾されたオブジェクトを使用できる。
  • デコレータは、装飾するオブジェクトに委譲する前後どちらかまたは両方で独自の振る舞いを追加して、残りの処理を実行する
  • いつでもオブジェクトを装飾できるため、任意の数のデコレータを使って実行時に動的にオブジェクトを装飾できる

概要

なぜこのパターンを使用するか?

このパターンの使いどころ

典型的な継承の乱用を再検証し、オブジェクトコンポジションの形式を使って
実行時にクラスを装飾する。

クラス図

このパターンに必要な材料

各材料の役割・関係

このパターンの良いところ

装飾の手法を知れば、基盤となるクラスのコードを全く変更することなく、オブジェクトに新しい責務を与えることができる。

実装の仕方

デコレータはそれが装飾するオブジェクトと同じ型である必要がある。
から、デコレータは、装飾するオブジェクトと同じ型を継承するべき。

class Coffee{
    String description;
    int milk;
    int soy;
    int mocha;
    int whip;
String getDescription();
int cost();
bool hasMilk();
void  setMilk(int amount);
bool hasSoy();
void hasMocha(int amount);
bool hasMocha();
void setMocha(int amount);
bool hasWhip();
void setWhip(int amount);
}

このパターンが実際に使用されている例

関連パターン


open-closed-principle wrapper

サポートサイト Wikidot.com open-closed-principlewrapper