設計模式 - 裝飾器模式



裝飾器模式允許使用者在不改變其結構的情況下向現有物件新增新的功能。這種設計模式屬於結構型模式,因為這種模式充當現有類的包裝器。

此模式建立一個裝飾器類,該類包裝原始類並提供額外的功能,同時保持類方法簽名不變。

我們將透過以下示例演示裝飾器模式的使用,在該示例中,我們將用某種顏色裝飾形狀,而無需更改形狀類。

實現

我們將建立一個Shape介面和實現Shape介面的具體類。然後,我們將建立一個抽象裝飾器類ShapeDecorator,它實現Shape介面並將其Shape物件作為其例項變數。

RedShapeDecorator是實現ShapeDecorator的具體類。

DecoratorPatternDemo,我們的演示類將使用RedShapeDecorator來裝飾Shape物件。

Decorator Pattern UML Diagram

步驟 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
廣告

© . All rights reserved.