Decorator は、 構造に関するパターンのひとつで、 オブジェクトをデコレーターと呼ばれる特別なラッパー・オブジェクト内に配置することにより、 新しい振る舞いを動的に追加できます。
対象のオブジェクトとデコレーターは同じインターフェースに従うため、 デコレーターを使うと、 オブジェクトを何重にも包み込むことができます。 その結果として生成されるオブジェクトは、 全部のラッパーの振る舞いを集積した振る舞いをします。
複雑度:
人気度:
使用例: Decorator は、 Java コードではかなり標準的で、 特にストリームに関連するコードではよく使われます。
Java のコア・ライブラリーでの Decorator の使用例です:
見つけ方: Decorator は、 そのクラスと同じクラスまたはインターフェースのオブジェクトをパラメーターとして取る生成メソッドかコンストラクターの存在により識別できます。
暗号化デコレーターと圧縮デコレーター
この例では、 コードを変更せずにオブジェクトの動作を変える方法を紹介します。
最初は、 ビジネス・ロジックのクラスは平文のテキストのデータの読み書きしかできませんでした。 次に、 ラップされたオブジェクトが標準操作を実行した後に新しい動作を追加するため、 小さなラッパー・クラスをいくつか作成しました。
最初のラッパーはデータの暗号化と復号化を行い、 二つ目のラッパーはデータの圧縮と解凍を行います。
デコレーターを別のデコレーターで包み込み、 組み合わせることさえできます。
decorators
decorators/DataSource.java: 読み書きの操作を定義する共通データ・インターフェース
decorators/FileDataSource.java: 単純なデータの読み取り・書き取りクラス
decorators/DataSourceDecorator.java: 抽象基底デコレーター
decorators/EncryptionDecorator.java: 暗号化デコレーター
decorators/CompressionDecorator.java: 圧縮デコレーター
Demo.java: クライアント・コード
OutputDemo.txt: 実行結果