読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

12.Decorator 飾り枠と中身の同一視

透過的なインターフェース。ComponentをいくらDecoratorで包んでも、APIは隠されない。
中身を変えずに機能追加ができる。
動的な機能追加ができる。
単純な品揃ででも多様な機能追加ができる。
デメリットは小さいクラスが増えてしまうこと。

f:id:p-monster:20121218195303p:plain

Component・・・機能を追加するときの核。デコレーションする前のスポンジケーキ。スポンジケーキのAPIだけ定める
ConcreteComponent・・・Componentの実装。
Decorator・・・Componentと同じAPIを持つ。飾る対象となるComponentを保持する
ConcreteDecorator・・・Decoratorの実装

LeafとCompositeはComponentを実装する。CompositeはComponentを格納する。
ComponentにはCompositeのAPIが含まれるが、Leafはそのすべてを実装する必要はない。たとえばディレクトリにはファイルやディレクトリを格納するというAPIがあるが、ファイルがそのAPIを持つ必要はない。
一般的に木構造になるデータ構造はCompositeパターン。

関連しているパターン

Adapter・・・DecoratorパターンはAPIを変えずに外枠を作る。Adapterパターンはズレがある2つのAPIをつなぐ
Strategy・・・Decoratorパターンは外枠を取り替えたり、外枠を重ねたりして機能を追加する。Strategyパターンはアルゴリズムを切り替えて機能を変更する。

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門