裝飾者模式(Decorator)

定義

動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴(kuò)展對象的功能。

為什么要使用裝飾者模式

  • 在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責(zé)。
  • 處理那些可以撤消的職責(zé)。
  • 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的 子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

角色

  1. 抽象組件:定義一個抽象接口,來規(guī)范準(zhǔn)備附加功能的類
  2. 具體組件:將要被附加功能的類,實現(xiàn)抽象構(gòu)件角色接口
  3. 抽象裝飾者:持有對具體構(gòu)件角色的引用并定義與抽象構(gòu)件角色一致的接口
  4. 具體裝飾:實現(xiàn)抽象裝飾者角色,負(fù)責(zé)對具體構(gòu)件添加額外功能。

實例

抽象組件

public interface Shape {
    void draw();
}

具體組件

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

抽象裝飾者

public abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;
    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }
    public void draw(){
        decoratedShape.draw();
    }
}

具體裝飾

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

測試代碼

public class Test {
    public static void main(String[] args) {
        Shape shape = new Rectangle();
        ShapeDecorator decorator = new RedShapeDecorator(shape);
        decorator.draw();
    }
}

運(yùn)行結(jié)果

shape: rectangle
Border Color: Red
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容