一.裝飾者模式定義:
動態地為一個對象添加一些額外的職責,若要擴展一個對象的功能,裝飾者提供了比繼承更有彈性的替代方案。
模式的結構圖:
二.模式包含角色 :
抽象構件類(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