Java裝飾模式

裝飾器模式允許用戶向現有對象添加新功能而不改變其結構。 這種類型的設計模式屬於結構模式,因爲此模式充當現有類的包裝器。

此模式創建一個裝飾器類,它包裝原始類並提供附加功能,保持類方法簽名完整。

我們通過以下示例展示裝飾器模式的使用,其中我們將用一些顏色裝飾形狀而不改變形狀類。

實現實例

在這個實例中,將創建一個Shape接口和實現Shape接口的具體類。然後再創建一個抽象裝飾器類-ShapeDecorator,實現Shape接口並使用Shape對象作爲其實例變量。

這裏的RedShapeDecorator是實現ShapeDecorator的具體類。

DecoratorPatternDemo這是一個演示類,將使用RedShapeDecorator來裝飾Shape對象。裝飾模式示例的結構如下所示 -

Java裝飾模式

第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("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle 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