意圖
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更加靈活特碳。裝飾模式又稱包裝器Wrapper诚亚。
結(jié)構(gòu)
裝飾模式.jpg
實現(xiàn)
- Component(抽象構(gòu)件),定義一個對象接口午乓,可以給這些對象動態(tài)地添加職責(zé)站宗,它是具體構(gòu)件和抽象裝飾類的共同父類。
- ConcreteComponent(具體構(gòu)件)益愈,它是抽象構(gòu)件類的子類梢灭,用于定義具體的構(gòu)件對象,實現(xiàn)了在抽象構(gòu)件中聲明的方法蒸其,裝飾器可以給它增加額外的職責(zé)(方法)敏释。
- Decortor(抽象裝飾類),維持了一個Component引用摸袁,并定義了一個與Component 接口一致的接口钥顽。
- ConcreteDecortor(具體裝飾類),它是抽象裝飾類的子類靠汁,負(fù)責(zé)向構(gòu)件添加新的職責(zé)蜂大。每一個具體裝飾類都定義了一些新的行為,它可以調(diào)用在抽象裝飾類中定義的方法蝶怔,并可以增加新的方法用以擴(kuò)充對象的行為奶浦。
我們先來定義Component,可以是接口或者抽象類
public interface Component {
void operation();
}
接下來是ConcreteComponent ,是 Component 的實現(xiàn)類
public class ConcreteComonpent implements Component{
@Override
public void operation() {
System.out.println("This is the Concrete Component");
}
}
其次是 Decortor 類踢星,這里維持了一個 Component 的引用财喳,可以通過 set 方法 或者構(gòu)造方法等等。
public abstract class Decorator implements Component{
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if(component != null){
component.operation();
}
}
}
最后是我們的 ConcreteComponentA 和 ConcreteComponentB 類斩狱,它們都是具體的裝飾對象耳高,起到給Component 添加職責(zé)的功能。
public class ConcreteDecoratorA extends Decorator{
private String addState;
@Override
public void operation() {
super.operation();
addState = "New state"; //進(jìn)行裝飾
System.out.println("This is the ConcreteDecoratorA," + addState);
}
}
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
addedBehavior(); //進(jìn)行裝飾
System.out.println("This is the ConcreteDecoratorB");
}
private void addedBehavior(){
System.out.println("addedBehavior");
}
}
裝飾模式在 Android 中的應(yīng)用 —— Context所踊,作為一名 Android 開發(fā)者泌枪,Context 應(yīng)該是再也熟悉不過的了。我們平常用的最多的 startActivty 方法就是這個類當(dāng)中的秕岛。首先碌燕,我們來看一下 Context 的繼承結(jié)構(gòu)。
Context繼承結(jié)構(gòu).jpg
簡直和上圖的裝飾模式 UML 一模一樣继薛。
- Context 對應(yīng)著 Component
- ContextImpl 對應(yīng)著 ConcreteComponent
- ContextWraper 對應(yīng)著 Decorator
- Activity修壕、Application、Service遏考、ContextThemeWrapper 對應(yīng)著 ConcretDecorator慈鸠。
參考資料
[1] PleaseCallMeCoder. 從裝飾者模式到Context類族
[2] Erich Gamma,Richard Helm灌具,Ralph Johnson青团,John Vlissides. 設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M]. 李英軍等譯.北京:機(jī)械工業(yè)出版社譬巫,2009.
[3] 程杰. 大話設(shè)計模式[M]. 北京 : 清華大學(xué)出版社 , 2007.