設計模式——裝飾者模式
阿新 • • 發佈:2018-03-31
什麽 很多 方法 info 改變 劃分 llb 設計 nts
- 什麽是裝飾者模型
裝飾者模型通過組合的方式擴展對象的特性,動態地給對象添加額外的職責。在增加功能上,裝飾模式比生成子類更加靈活。
- 職責劃分
- Component抽象構建,是接口或者抽象類,就是定義原始對象。
- ConcreteComponent具體構件,是原始對象的實現,也就是被裝飾者,我們需要裝飾的就是它。
- Decorator裝飾角色,一般是一個抽象類,實現接口或者抽象方法,它裏面不移動有抽象方法,在他的屬性裏面必然有private變量指向Component構件。
- ConcreteDecoratorA,具體的裝飾類,把原始對象進行修飾
- 裝飾者模式UML圖
被修飾接口Window 對應 Component
public interface IWindow {
void draw();
String getDescription();
}
被修飾者SimpleWindow 對應 ConcreteComponent
public class SimpleWindow implements IWindow { @Override public void draw() { logger.info("SimpleWindow draw") } @Override public String getDescription() { return "SimpleWindow Description"; } }
裝飾角色WindowDecorator 對應 Decorator
public abstract class WindowDecorator implements IWindow{ private IWindow window; public WindowDecorator(IWindow window) { this.window = window; } @Override public void draw() { window.draw(); } @Override public String getDescription() { return window.getDescription(); } }
具體裝飾類IoDecorator 對應 ConcreteDecoratorA
public class IoDecorator extends WindowDecorator {
public HorizontalScrollBarDecorator(IWindow window) {
super(window);
}
@Override
public void draw() {
super.draw();
logger.info("Io draw");
}
@Override
public String getDescription() {
return super.getDescription() + "IO";
}
}
優點:
(1)裝飾者模式可以提供比繼承更多的靈活性
(2)具體構件類與具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。
缺點:
(1)會產生很多的小對象,增加了系統的復雜性
(2)排錯也很困難,對於多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。
設計模式——裝飾者模式