JAva装飾モード(Decorator Pattern)詳細

3140 ワード

デコレーション・モード(Decorator Pattern)を使用すると、既存のオブジェクトに構造を変更することなく新しい機能を追加できます.このタイプの設計モードは、既存のクラスとしてパッケージされた構造型モードに属します.
このモードは、既存のクラスをパッケージし、クラスメソッドの署名の完全性を維持する前提で、追加の機能を提供する装飾クラスを作成します.
以下の例を用いて,装飾器モードの使用を実証した.その中で、私たちは1つの形状に異なる色を装飾し、同時に形状類を変えません.
インプリメンテーション
ShapeインタフェースとShapeインタフェースを実装したエンティティクラスを作成します.次に、Shapeインタフェースを実装する抽象的な装飾クラスShapeDecoratorを作成し、Shapeオブジェクトをインスタンス変数とします.
RedShapeDecoratorはShapeDecoratorを実装したエンティティークラスです.
DecoratorPatternDemo、我々のプレゼンテーションクラスはRedShapeDecoratorを使用してShapeオブジェクトを装飾します.
ステップ1
インタフェースを作成します.
Shape.java


public interface Shape {
 void draw();
}
 


ステップ2
実装インタフェースのエンティティークラスを作成します.
Rectangle.java


public class Rectangle implements Shape {
 
 @Override
 public void draw() {
  System.out.println("Shape: Rectangle");
 }
}
Circle.java

public class Circle implements Shape {
 
 @Override
 public void draw() {
  System.out.println("Shape: Circle");
 }
}
 


手順3
Shapeインタフェースを実装した抽象的な装飾クラスを作成します.
ShapeDecorator.java


public abstract class ShapeDecorator implements Shape {
 protected Shape decoratedShape;
 
 public ShapeDecorator(Shape decoratedShape){
  this.decoratedShape = decoratedShape;
 }
 
 public void draw(){
  decoratedShape.draw();
 } 
}
 


手順4
ShapeDecoratorクラスから拡張されたソリッド装飾クラスを作成します.
RedShapeDecorator.java


public class RedShapeDecorator extends ShapeDecorator {
 
 public RedShapeDecorator(Shape decoratedShape) {
  super(decoratedShape);  
 }
 
 @Override
 public void draw() {
  decoratedShape.draw();   
  setRedBorder(decoratedShape);
 }
 
 private void setRedBorder(Shape decoratedShape){
  System.out.println("Border Color: Red");
 }
}


手順5
RedShapeDecoratorを使用してShapeオブジェクトを装飾します.
DecoratorPatternDemo.java


public class DecoratorPatternDemo {
 public static void main(String[] args) {
 
  Shape circle = new Circle();
 
  Shape redCircle = new RedShapeDecorator(new Circle());
 
  Shape redRectangle = new RedShapeDecorator(new Rectangle());
  System.out.println("Circle with normal border");
  circle.draw();
 
  System.out.println("
Circle of red border"); redCircle.draw(); System.out.println("
Rectangle of red border"); redRectangle.draw(); } }

ステップ6
出力を確認します.

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red




読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!