よーしあとはこれをかぶせるだけで、左右に動いたりチカチカしたりして目立つぞー。ようこそ私のホームページへ。あなたは counter.gif 番目のお客様です(キラキラ)。うーん、若い人材はたぶんインターネット老人会ネタには食いつかないよ。
ちょっとさみしい機能に皮をかぶせて、透過的にリッチな振る舞いを得られるようにするのが Decorator パターンです。
もとのインスタンスはそのままでオッケー。もとの要素を内部に持つ <marquee>
や <blink>
装飾つきのタグで、もとあった場所を差し替え。装飾付きでも同じ型なので、外から見た扱いは同じだからおかしくなる心配なし。本来の機能に委譲 (穴あきパネル) してあれば、たぶん機能の本質は失われてないからデグレにはならない。
Python の文法には、関数にかぶせて振る舞いを拡張するデコレーターがありますが、まさにそれが、関数というオブジェクト に対する Decorator です。
視覚的な飾り付けでなくても、前後でログを取れるようにしたり、リソースアクセスへの排他制御をしたりも、Decorator パターンの形をしていることがあります。
本質以外の煩雑な仕事を、取り外しできる透過的なものに分離する、関心の分離ですね。アスペクト指向プログラミングほど透明ではないので、インスタンス関係のコンフィグには変更が必要だけど、特別な機構のない素朴なオブジェクト指向だけでやってるのがこのパターンのいいところです。
いわゆるラッパークラスです。だけど、同じラッパークラスの Adapter とは異なるパターンです。Adapter は「右と左の端子形状が合わなくてつながらないから、両端に異なるタイプの端子を設けてつなぐ」ラッパー、Decorator は「右と左の端子がすでにかみ合っているところに、それと同じ形の端子を付けた装置を割り込ませる」ラッパー。同じ構造に見えても、その目的が違うことに注意してください。