原文連接
譯者:smallclover
我的翻譯,由於英語水平的緣由可能會詞不達意,十分歡迎各位讀者指出其中的錯誤,但願能對讀者有1%的用處,謝謝!java
裝飾器模式容許使用者將新功能添加到現有的對象而不須要改變它的數據結構。這種類型的設計模式來源於結構型模式,該設計模式將會去包裝一個現有的類。
這種設計模式會常見一個裝飾器類,它包裝了原始類,而且在不改變原始類的方法的基礎之上添加額外的新的功能。
咱們將經過下面的例子來展現如何使用裝飾器模式,在接下來的例子中咱們將用顏色來裝飾圖形,但不須要修改圖形的類。設計模式
咱們將建立一個Shape接口和實現該接口的具體類。而後在建立一個抽象的ShaperDecorator
類,該類也實現了Shape
接口,而且持有一個Shape
類的對象。RedShapeDecorator
做爲具體類實現了ShapeDecorator
。DecoratorPatternDemo
,做爲咱們的demo類將會去使用RedShapeDecorator
去裝飾Shape
對象。數據結構
建立接口
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