デザインパターンを覚えたい (Decorator)

Decoratorパターン

クラスをかぶせていって機能追加を行うパターン。共通の親元を持つ中身と飾りのクラスを用意し、共通メソッドを再帰的に呼び出していくことで機能拡張をする。
Decoratorパターンの特徴は、

  1. 共通の親クラスを持つサブクラスで包んでいくため、外部プログラムからは共通のメソッドが見える
  2. 大元の中身となる部分を変更することなく、機能拡張を行うことができる

といったところかな。java.ioとかがDecoratorパターンとしては有名。

実装。今日はc++で行こうかね。
http://dl.dropbox.com/u/7810000/code/design_pattern/decorator.zip

実行結果。

$ ./decorator_test
ご飯 どーん
トンカツ どーん
まぐろ どーん
いくら どーん
天ぷら どーん
天いくら鉄火カツ丼(1000 kcal) 一丁、へいおまち!

コードのポイントは呼び出し部分でコンストラクタをどんどん被せていってるところ。

int main() {
    Component* don = 
        new Tempura(
            new Ikura(
                new Tuna(
                    new Tonkatsu(
                        new Rice()
                        )
                    )
                )
            );

    std::cout << don->getName() << "(" << don->getCalorie() << " kcal) 一丁、へいおまち!" << std::endl;

    return 0;
}

coutのgetNameとgetCalorieでは内部で包んだインスタンス再帰的に呼ばれている。

これで12パターン目で、23パターンもちょうど半分ですかね。先は長いねぇ。
一度やったパターンでもやっぱり理解がまだまだ浅いから、どこかでまとめて整理するタイミングが必要かも。