装飾者
デコレーター(Decoratorパターン)は、その構造を変更することなく、既存のオブジェクトに新しい機能を追加することができます。 デザインパターンのこのタイプは、構造モデルに属し、それはラッパークラスとして使用可能です。
このパターンは、追加機能を提供する前提の下で署名の完全性を維持する上で元のクラスとクラスのメソッドをラップするために使用される装飾を作成します。
私たちは、Decoratorパターンを示すために、次の例を使用します。 これらの中で、我々は、クラスの形状を変更することなく、異なる色で装飾を形成します。
入門
意図:動的オブジェクトには、いくつかの追加の責任を追加します。機能性を増加させ、Decoratorパターンは、より柔軟なサブクラス化比較しました。
主に解決するために:一般的に、私たちはしばしば達成するために、クラスの継承を拡張するために使用される、静クラスの継承機能の導入と増加に伴って拡張された機能に、サブクラスはうねりであろう。
使用するようにすると:あなたは多くのサブカテゴリ拡張クラスの場合の増加を望んでいません。
解決方法:Decoratorパターンを継承しつつ、特定の機能の責任を分割します。
キーコード:1、コンポーネントクラスは抽象ロールとして機能し、特定の実装すべきではありません。2、変更されたクラス参照と継承Componentクラスは、特定の拡張クラスは親クラスのメソッドをオーバーライドします。
アプリケーション例:彼は「寺」となった場合1、猿王72変更、彼は単に猿だったが、彼は寺院の機能を有しています。図2は、関係なく、画像フレームの壁に存在掛けすることができるが、通常は額縁があり、フレームは、実際に壁に掛かりました。 壁に掛かって前に、絵はガラスで覆うことができる、フレームの家に取り付けられ、その後、絵画、ガラスとフレームがオブジェクトで形成されました。
長所:装飾的なパターンは、継承の代替モードであり、装飾や装飾が独立して開発することができ、相互に結合されていない、装飾的なパターンは、動的機能を実装するクラスを拡張することができます。
短所:より複雑な多層の装飾。
使用シナリオ:1、クラスの機能を拡張します。2、動的な増加の機能は、動的に取り消さ。
注:継承を置き換えることができます。
実現
私たちは、エンティティクラスのShapeインタフェースのShapeインタフェースと実装を作成します。 その後、我々は、そのインスタンス変数として抽象的な装飾ShapeDecoratorの Shapeインタフェースの実現とShapeオブジェクトを作成します。
RedShapeDecoratorは、エンティティクラスのShapeDecoratorを達成することです。
DecoratorPatternDemo、Shapeオブジェクトを飾るためにRedShapeDecoratorを使用して、私たちのデモクラス。
ステップ1
インターフェイスを作成します。
Shape.java
パブリック・インタフェースShape { ボイドドロー(); }
ステップ2
インターフェイスを実装するエンティティクラスを作成します。
Rectangle.java
パブリッククラス長方形は{Shapeを実装します @Override 公共ボイドドロー(){ System.out.println( "形状:長方形"); } }
Circle.java
パブリッククラスサークル{Shapeを実装します @Override 公共ボイドドロー(){ System.out.println( "形状:サークル"); } }
ステップ3
抽象的な装飾Shapeインタフェースを実現作成します。
ShapeDecorator.java
パブリック抽象クラスShapeDecoratorは{Shapeを実装します 保護された形decoratedShape。 公共ShapeDecorator(decoratedShape形状){ this.decoratedShape = decoratedShape。 } 公共ボイドドロー(){ decoratedShape.draw()。 } }
ステップ4
拡張エンティティ装飾ShapeDecoratorクラスを作成します。
RedShapeDecorator.java
パブリッククラスRedShapeDecoratorはShapeDecoratorを{拡張します 公共RedShapeDecorator(decoratedShape形状){ スーパー(decoratedShape)。 } @Override 公共ボイドドロー(){ decoratedShape.draw()。 setRedBorder(decoratedShape)。 } プライベートボイドsetRedBorder(decoratedShape形状){ System.out.println( "ボーダーカラー:レッド"); } }
ステップ5
RedShapeDecoratorは、Shapeオブジェクトを飾るために使用します。
DecoratorPatternDemo.java
パブリッククラスDecoratorPatternDemo { 公共の静的な無効メイン(文字列[] args){ 円=新しいサークル形状(); redCircle =新しいRedShapeDecorator形状(新しいサークル()); redRectangle =新しいRedShapeDecorator形状(新しいRectangle()); System.out.println( "通常のボーダーを持つサークル"); circle.draw()。 System.out.println( "赤枠の\エヌサークル"); redCircle.draw()。 System.out.println( "赤枠の\ nRectangle"); redRectangle.draw()。 } }
ステップ6
出力を確認します。
通常のボーダーを持つサークル 形状:サークル 赤枠のサークル 形状:サークル ボーダーカラー:レッド 赤枠の長方形 形状:長方形 ボーダーカラー:レッド