2月、3月中にデザパタマルチまで読み終わるつもりがまったく読み終わってないのがすでにばれているので普通にメモ書きます。


CompositeパターンとDecoratorパターン。。。
ほぼ同じような構造だと思われる。(ように感じた。)
とりあえず自分で簡単に説明してみようと試みる。

  • Compositeパターン


結城さんの本に例としてあげてあったファイルとディレクトリなど、ふたつを同じようなものとして扱いたく、階層的な(再帰的な)構造を必要とする場合などに使われる(予想)。


Componentクラス(Leaf、Compositeのスーパークラス)で共通のインターフェースを提供する
Leafクラス(ファイル)でそのインターフェースを実装する。
Compositeクラス(ディレクトリ)でLeafやComposite自身のインスタンスを保持し、それを使いつつインターフェイスを実装。二つを透過的に(等価的に)扱う。


こんな感じ。(だと思う。)


  • Decorator


こちらは構造はCompositeパターンと似てる。(と思った。)
しかし使われ方がだいぶ違うといったところ?


Componentクラス(ConcreteComponent、Decoratorのスーパークラス)で、共通のインターフェースを提供する。
ConcreteComponentクラスで基本的な機能を実装する。
DecoratorクラスでComponentクラスの属性を保持する。(抽象クラス)
ConcreteDecoratorクラスでDecoratorクラスを継承し、属性に保持されたComponentクラスのメソッドに加えて、各メソッドを拡張実装する。(委譲関係)


長所
違う追加機能を持ったConcreteDecoratorクラスをたくさん作ることによって、容易に拡張が可能であること。
実装(ConcreteComponent)と機能(Decorator)が切り離されていること。(だと思った。)

new アンダーラインをひくクラス(new 文末に('д`)を追加するクラス(new 文字列を表示するクラス("ぬるぽ"))).printLine();
とやれば、


ぬるぽ('д`)


と表示させることができる。
追記:ぬるぽはてなキーワードにひっかかって変なことになっているがホントは"ぬ"から")"までアンダーラインがひかれる。

この場合アンダーラインと('д`)はConcreteDecoratorクラス,ぬるぽ(文字列表示)はConcreteComponentクラスである。printLineはComponentクラスで提供されるすべてに共通のインターフェース。本のなかではTemplateとしてComponentでshowメソッドが与えられていた。showはオーバーライドされない。

短所
小さいクラスがたくさんできること。(らしい。)


あ〜、自分で書いててわかりにきぃ説明だなと思った。
こんな説明では忘れて見直したとき思いだせんがなorz。

追記:そういえばJavaってクラスの中の変数のことフィールドって言いますね。属性。は変かな。属性とも言うんだっけ?まぁいいや。