装飾的なパターン(デコレータ):動的にいくつかの追加の責任増加機能を追加することを目的に、装飾パターンサブクラスよりも柔軟です。
コード例:
パブリック抽象クラスコンポーネント{
パブリック抽象ボイド動作();
}
コンポーネントクラスConcreteComponent延び{公共
@Override
公共ボイド動作(){
System.out.printlnは(「特定の操作対象」);
}
}
パブリッククラスデコレータは、コンポーネント{延び
保護コンポーネント成分を、
公共ボイドsetComponent(成分成分){
this.component =コンポーネント。
}
@Override
公共ボイド操作(){
IF(成分= NULL!){
component.operation()。
}
}
}
パブリッククラスConcreteDecoratorAはデコ{拡張
プライベート文字列addedStateを。
@Override
公共ボイド操作(){
super.operation()。
addedState = "新国家";
System.out.println( "具体装饰对象A的操作")。
}
}
デコレータクラスConcreteDecoratorB {公共延び
@Override
公共ボイド動作(){
; super.operation()
addedBehavior();
のSystem.out.println( "特定動作装飾オブジェクトB");
}
公共ボイドaddedBehavior(){
のSystem.out .println( "追加の操作装飾オブジェクトB");
}
}
パブリッククラスTestDecorator {
パブリック静的無効メイン(文字列[] args){
ConcreteComponent C =新しいConcreteComponent()。
ConcreteDecoratorA A =新しいConcreteDecoratorA();
ConcreteDecoratorB B =新しいConcreteDecoratorB()。
c.operation();
System.out.println( "--------------------------");
a.setComponent(C);
a.operation();
System.out.println( "--------------------------");
b.setComponent(A)。
b.operation();
System.out.println( "--------------------------");
}
}
一つだけConcreteComponentクラス抽象コンポーネントクラスのない場合は、デコレータークラスがConcreteComponentのサブクラスです。
一つだけConcreteDecoratorクラスがある場合は同様に、そこ別々のデコレータークラスの必要はなく、クラスにデコレータの責任とConcreteDecoratorをマージすることができます。
装飾的なパターンはSetComponent包装対象物を使用することです。分離された、このオブジェクトを使用し、各装飾品だけでその機能を気にするか、オブジェクトがそれらのチェーンに追加されるかを気にする必要はありません上の各装飾品の実装。
要約:
パターン装飾動的に多くの機能を機能を追加する方法があります。システムは、それが新しいコードで古いクラスに追加されたときに新しい機能を追加する必要がある場合、新しいコードは通常、キー役者の元のクラスのコアの責任で飾られたり、新しいロジックを追加することにより、メインクラスの複雑さを増しています。できる装飾的なパターンは、別のクラスで各機能にそれを飾る、そしてそれは、オブジェクトのパッケージを飾るために作るために、非常に優れたソリューションを提供しますので、あなたは特別な行為を実行する必要がある場合、クライアントコード実行時に順次ラップされたオブジェクトの装飾的な機能を使用して、選択的に必要。
利点は、効果的に離れてコア業務と装飾的なリボンクラスです。そして、関連するクラスは、重複した装飾的なロジックを削除することができます。