裝飾器模式-設計模式


一.裝飾者模式定義:
​動態地為一個對象添加一些額外的職責,若要擴展一個對象的功能,裝飾者提供了比繼承更有彈性的替代方案。
模式的結構圖:

 

二.模式包含角色 :
抽象構件類(Component):給出一個抽象的接口,用以規范准備接收附加責任的對象
具體構件類(ConcreteComponent):定義一個具體的准備接受附加責任的類,其必須實現Component接口。
裝飾者類(Decorator):持有一個構件(Conponent)對象的實例,並定義一個和抽象構件一致的接口。
具體裝飾者類(ConcreteDecoratator):定義給構件對象“貼上”附加責任。

三.使用場景:
I/O流,數據源包裝 ,Spring 中用到的裝飾器模式在類名上有兩種表現:一種是類名中含有 Wrapper,另一種是類名中含有Decorator。

①.用於拓展一個類的功能或者給一個類添加附加職責
②.動態的給一個對象添加功能,這些功能可以再動態的撤銷。
③.需要為一批的兄弟類進行改裝或加裝功能。

四.裝飾模式的優缺點
優點:
1、裝飾器是繼承的有力補充,比繼承靈活,不改變原有對象的情況下動態地給一個對象擴展功能,即插即用。
2、通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果。
3、裝飾器完全遵守開閉原則。
缺點:
1、會出現更多的代碼,更多的類,增加程序復雜性。
2、動態裝飾時,多層裝飾時會更復雜。追蹤代碼更難看點

五.代碼如下所示:
抽象構件角色

public interface Component {
    public void sampleOpreation();
}

 具體構件角色:

public class ConcreteComponent implements Component {
    @Override
    public void sampleOpreation() {
        // TODO 完成相關的業務代碼
    }
}

 裝飾角色

public class Decorator implements Component {
    private Component component;
    
    public Decorator(Component component) {
        this.component = component;
    }
    
    @Override
    public void sampleOpreation() {
        //委派給構件
        component.sampleOpreation();
    }

}

 具體裝飾角色

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    
    @Override
    public void sampleOpreation() {
        super.sampleOpreation();
        //TODO 完成相關的業務代碼
    }
}

 

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    
    @Override
    public void sampleOpreation() {
        super.sampleOpreation();
        //TODO 完成相關的業務代碼
    }
}

參考網站:https://www.jianshu.com/p/d80b6b4b76fc

https://www.cnblogs.com/yssjun/p/11110013.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM