鍍金池/ 教程/ Java/ Java裝飾模式
Java前端控制器模式
Java工廠設(shè)計模式
Java抽象工廠模式
Java觀察者模式
Java門面模式(或外觀模式)
Java備忘錄模式
Java MVC模式
Java單例模式
Java傳輸對象模式
Java迭代器模式
Java責任鏈模式
Java命令模式
Java原型模式
Java解釋器模式
Java適配器模式
Java狀態(tài)模式
Java中介者模式(Mediator Pattern)
Java攔截過濾器模式
Java策略模式
Java組合模式
Java業(yè)務(wù)代理模式
Java裝飾模式
Java模板模式
Java橋接模式
Java過濾器模式(條件模式)
Java享元模式(Flyweight Pattern)
Java建造者(Builder)模式
Java設(shè)計模式
Java空對象模式
Java數(shù)據(jù)訪問對象模式
Java訪問者模式
Java組合實體模式
Java服務(wù)定位器模式

Java裝飾模式

裝飾器模式允許用戶向現(xiàn)有對象添加新功能而不改變其結(jié)構(gòu)。 這種類型的設(shè)計模式屬于結(jié)構(gòu)模式,因為此模式充當現(xiàn)有類的包裝器。

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

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

實現(xiàn)實例

在這個實例中,將創(chuàng)建一個Shape接口和實現(xiàn)Shape接口的具體類。然后再創(chuàng)建一個抽象裝飾器類-ShapeDecorator,實現(xiàn)Shape接口并使用Shape對象作為其實例變量。

這里的RedShapeDecorator是實現(xiàn)ShapeDecorator的具體類。

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

第1步

創(chuàng)建一個簡單的接口。
Shape.java

public interface Shape {
   void draw();
}

第2步

創(chuàng)建兩個實現(xiàn)相同接口的具體類。
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步

創(chuàng)建實現(xiàn)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步

創(chuàng)建擴展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步

驗證輸出,執(zhí)行上面的代碼得到以下結(jié)果 -

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red