このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

  • 追加された行はこの色です。
  • 削除された行はこの色です。
*目次 [#eb1d8a86]

#contents


*Decoratorパターン [#g4371eb9]

-構造に関するパターンの一種。
-オブジェクトに対して、動的に機能を追加するためのパターン。
-Filterとも呼ばれ、継承よりも柔軟な機能拡張ができる。
-既存のクラスに機能を追加するには、継承させたサブクラスに機能を追加することができるが、それ以外の継承を使わない方法がこのDecoratorパターンである。
--既存クラスを内包して飾り付けをするクラスを作りたいとする。このとき継承ではなく、その既存クラス自体を作成して利用してしまう。そのとき同じインタフェースで作成することで、継承と同じように既存クラスのメソッドを利用できる。

-オブジェクトに付加的な責務を動的に付与する。デコレータはサブクラス化の代替となる、柔軟な機能拡張手段を提供する。
-Decoratorパターンは具象コンポーネントをラップする使用するデコレータクラス群を必要とする。


*構造 [#y97cfc99]

-デコレータクラスは装飾するコンポーネントの型と同じ型である。
--実際には継承かインタフェース実装のどちらかを使って、装飾するコンポーネントと同じ型になる。
-デコレータはコンポーネントへのメソッド呼び出しの前後どちらかまたは両方に(またはメソッド呼び出しの代わりに)新しい機能を追加することで、コンポーネントの振る舞いを変更する。
-コンポーネントは任意の数のデコレータでラップできる。」
-一般にデコレータはコンポーネントのクライアントに対して透過的である。クライアントがコンポーネントの具象型に依存していない限りはそうなる。

*デメリット [#h416507c]

-通常はデコレータを透過的に挿入でき、クライアントはデコレータを扱っていることをまったく知る必要はない。
--それにもかかわらず、コードの中には特定の型に依存しているものもあり、それにデコレータを挿入してしまうと問題が起きてしまう。
-デコレータにより最終的に設計に多数の小さなオブジェクトができる可能性があり、乱用すると複雑になる可能性がある。


*参考文献 [#h802158b]

-『Head Firstデザインパターン』