JavaDecoratorPattern(裝飾器模式)

凌浩雨發表於2017-09-10

裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

關鍵程式碼: 1、Component 類充當抽象角色,不應該具體實現。 2、修飾類引用和繼承 Component 類,具體擴充套件類重寫父類方法。

優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴充套件一個實現類的功能。
缺點:多層裝飾比較複雜。

  1. 建立一個介面。
/**
 * 1. 建立一個介面。
 * @author mazaiting
 */
public interface Shape {
    /**
     * 畫畫
     */
    void draw();
}
  1. 建立實現介面的實體類。
/**
 * 2. 建立實現介面的實體類。
 * @author mazaiting
 */
public class Circle implements Shape{
    
    public void draw() {
        System.out.println("Shape: Circle");
    }

}

/**
 * 2. 建立實現介面的實體類。
 * @author mazaiting
 */
public class Rectangle implements Shape{
    
    public void draw() {
        System.out.println("Shape: Rectangle");
    }

}
  1. 建立實現了 Shape 介面的抽象裝飾類。
/**
 * 3. 建立實現了 Shape 介面的抽象裝飾類。
 * @author mazaiting
 */
public abstract class ShapeDecorator implements Shape{
    protected Shape decoratShape;
    
    public ShapeDecorator(Shape decoratedShape){
        this.decoratShape = decoratedShape;
    }
    
    public void draw() {
        decoratShape.draw();
    }
    
}
  1. 建立擴充套件了 ShapeDecorator 類的實體裝飾類。
/**
 * 4. 建立擴充套件了 ShapeDecorator 類的實體裝飾類。
 * @author mazaiting
 */
public class RedShapeDecorator extends ShapeDecorator{

    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratShape.draw();
        setRedBorder(decoratShape);
    }
    
    private void setRedBorder(Shape decoratedShape){
        System.out.println("Border Color: Red");
    }
}
  1. 使用 RedShapeDecorator 來裝飾 Shape 物件。

/**
 * 5. 使用 RedShapeDecorator 來裝飾 Shape 物件。
 * @author mazaiting
 */
public class Client {
    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("
Circle of red border");
        redCircle.draw();

        System.out.println("
Rectangle of red border");
        redRectangle.draw();

    }
}
  1. 列印結果
Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red


相關文章