英語で「装飾者」を意味する言葉です。パターンでは、飾り枠と中身を同一視することで、より柔軟な機能拡張方法を提供します。Decoratorパターンは機能を一つひとつかぶせていくイメージになります。ある機能を持ったDecorationをコアとなるものにかぶせていくイメージです。サンプルケースサンプルケースでは、アイスクリームの話をしたいと思います。アイスクリーム屋さんでは、自由にトッピングを選べるようになっています。お客さんは、トッピングしなくても良いし、複数のトッピングを重ねて選択することもできます。アイスクリーム共通のインタフェースとして、以下のインタフェースを定義します。howSweet();}これらのインタフェースを持つクラスとしては、バニラアイスクリームクラス、抹茶アイスクリームクラスなどが以下のように提供されています。"抹茶味";}}さて、ここで、これらのアイスクリームインタフェース実装クラスにトッピングをしていくことを考えましょう。トッピングとしては、カシューナッツ、スライスアーモンドを考えて見ましょう。カシューナッツがトッピングされたバニラアイスクリームや、スライスアーモンドがトッピングされたバニラアイスクリームが要求されるわけです。これらのトッピングを乗せたインスタンスが必要となる場合、どのようなクラス設計をすればよいでしょうか。変わらないことにします。このような要求を満たすために、カシューナッツがトッピングされたバニラアイスクリームを表現するために、カシューナッツバニラアイスクリームクラスを作成する方法が考えられます。"カシューナッツバニラアイスクリーム";}}なるほど、これでもカシューナッツが乗ったバニラアイスクリームを得ることができます。CashewNutsVanillaIcecream();しかし、このような「継承を利用した機能の追加」は、非常に固定的なものとなってしまいます。カシューナッツを乗せた抹茶アイスクリームを表すインスタンスが欲しい場合は、抹茶アイスクリーム継承クラスが必要となるでしょう。パターンは、このように、様々な機能追加を柔軟に行いたい場合に威力を発揮します。拡張対象と同じインタフェースを実装させます。サンプルケースの場合は、トッピングとなるカシューナッツを表すクラスを作成します。ice.howSweet();}}クラス図は以下のようになります。クラスは、カシューナッツがトッピングされたアイスクリームを表すクラスです。得られる値に「カシューナッツ」という文字列を付加した値を返り値として返します。メソッドの返り値をそのまま返しています。スライスアーモンドがトッピングされたバニラアイスや、スライスアーモンドと、カシューナッツの両方がトッピングされたバニラアイスクリームなど、多様な組合せでのトッピングが可能になります。VanillaIcecream()));とても柔軟な機能追加が可能となっていることがわかると思います。まとめDecoratorパターンの一般的なクラス図は以下のようになります。Textを触ってみた。