Design Patterns - Decorator Pattern(譯)

原文連接
譯者:smallclover
我的翻譯,由於英語水平的緣由可能會詞不達意,十分歡迎各位讀者指出其中的錯誤,但願能對讀者有1%的用處,謝謝!java

設計模式-裝飾器模式

裝飾器模式容許使用者將新功能添加到現有的對象而不須要改變它的數據結構。這種類型的設計模式來源於結構型模式,該設計模式將會去包裝一個現有的類。
這種設計模式會常見一個裝飾器類,它包裝了原始類,而且在不改變原始類的方法的基礎之上添加額外的新的功能。
咱們將經過下面的例子來展現如何使用裝飾器模式,在接下來的例子中咱們將用顏色來裝飾圖形,但不須要修改圖形的類。設計模式

實現

咱們將建立一個Shape接口和實現該接口的具體類。而後在建立一個抽象的ShaperDecorator類,該類也實現了Shape接口,而且持有一個Shape類的對象。
RedShapeDecorator 做爲具體類實現了ShapeDecoratorDecoratorPatternDemo,做爲咱們的demo類將會去使用RedShapeDecorator去裝飾Shape對象。數據結構

clipboard.png

第一步

建立接口
Shape.javaide

public interface Shape {
   void draw();
}

第二步

建立具體的類來實現Shape接口
Rectangle.javathis

public class Rectangle implements Shape {

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

Circle.javaspa

public class Circle implements Shape {

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

第三步

建立抽象的裝飾器類實現Shape接口。
ShapeDecorator.java翻譯

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }    
}

第四步

建立具體的裝飾器類,該類繼承了ShaperDecorator類。
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");
   }
}

第五步

使用RedShapeDecorator裝飾Shape對象。
DecoratorPatternDemo.javacode

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();
   }
}

第六步

檢驗輸出orm

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
相關文章
相關標籤/搜索