裝飾器模式允許用戶向現(xiàn)有對象添加新功能而不改變其結(jié)構(gòu)。 這種類型的設(shè)計模式屬于結(jié)構(gòu)模式,因為此模式充當現(xiàn)有類的包裝器。
此模式創(chuàng)建一個裝飾器類,它包裝原始類并提供附加功能,保持類方法簽名完整。
我們通過以下示例展示裝飾器模式的使用,其中我們將用一些顏色裝飾形狀而不改變形狀類。
在這個實例中,將創(chuàng)建一個Shape
接口和實現(xiàn)Shape
接口的具體類。然后再創(chuàng)建一個抽象裝飾器類-ShapeDecorator
,實現(xiàn)Shape
接口并使用Shape
對象作為其實例變量。
這里的RedShapeDecorator
是實現(xiàn)ShapeDecorator
的具體類。
DecoratorPatternDemo
這是一個演示類,將使用RedShapeDecorator
來裝飾Shape
對象。裝飾模式示例的結(jié)構(gòu)如下所示 -
創(chuàng)建一個簡單的接口。
Shape.java
public interface Shape {
void draw();
}
創(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");
}
}
創(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();
}
}
創(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");
}
}
使用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();
}
}
驗證輸出,執(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