コンセプト
デコレーターパターンは、オブジェクトに責任を動的に添付します。機能を拡張するために、デコレーターは継承よりも柔軟な代替品を提供します。
デコレーターと装飾されたオブジェクトには、同じスーパータイプがあります。
1つ以上のデコレータでオブジェクトをラップできます。
デコレーターと装飾されたオブジェクトは同じスーパータイプを持っているため、元のオブジェクト(書かれた)が必要な場合は、装飾されたオブジェクトを置き換えることができます。
デコレーターは、特定の目的を達成するために委託されているデコレーターの行動の前後の行動を追加することができます。
オブジェクトはいつでも装飾できるため、オブジェクトは、ランタイム中にお気に入りのデコレーターで動的かつ無制限に装飾できます。
Javaでは、IOパッケージの下にある多くのクラスが、次のような典型的なデコレーターパターンの具体化です。
装飾クラスは、装飾されたクラスと同じインターフェースを実装します。
装飾されたクラスは、どの実装クラスを使用して装飾するかを気にしません。
同じビジネス方法が装飾クラスによって呼び出され、装飾クラスの機能を強化します。
例:
クラス図
パブリックインターフェイスiReader {void read(); } public class ReaderはiReaderを実装します{@Override public void read(){system.out.println( "read of reader"); }} public class BufferedReader Ireader {private iReader mreader; public bufferedreader(iReader reader){this.mreader = reader; } @Override public void read(){system.out.println( "BufferedReaderの読み取り"); mreader.read(); }} public class test {public static void main(string [] args){reader reader = new reader(); reader.read(); System.out.println( "----------"); BufferedReader BufferedReader = new BufferedReader(Reader); bufferedreader.read(); }}特徴:
1。装飾オブジェクトと実際のオブジェクトには同じインターフェイスがあります。このようにして、クライアントオブジェクトは、実際のオブジェクトと同じ方法で装飾的なオブジェクトと対話できます。
2。装飾的なオブジェクトには、実際のオブジェクトへの参照が含まれています
3.装飾オブジェクトは、クライアントからのすべてのリクエストを受け入れます。これらの要求を実際のオブジェクトに転送します。
4.オブジェクトの飾り付けは、これらのリクエストを転送する前または後にいくつかの追加機能を追加できます。これにより、実行時に、特定のオブジェクトの構造を変更せずに、追加の機能を外部に追加できます。
オブジェクト指向設計では、特定のクラスへの機能的な拡張は通常、継承によって達成されます。装飾の後、実際のオブジェクトはその機能を強化するために保持されます。
デコレーターモードとアダプターモードの違い:
新しい責任について:アダプターは、変換時に新しい責任を追加することもできますが、主な目的はそうではありません。デコレーターモデルは、主にデコレーターに新しい責任を追加します。
それがラップするオブジェクトについて:アダプターはアダプターの詳細(つまり、アダプタークラス)を知っています。デコレーターは、そのインターフェイスが何であるかを知っているだけです。
その特定のタイプ(基本クラスであろうと他の派生クラスであろうと)に関しては、ランタイム中にのみ知られています。