意圖
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更加靈活。裝飾模式又稱包裝器Wrapper。
結(jié)構(gòu)
裝飾模式.jpg
實(shí)現(xiàn)
- Component(抽象構(gòu)件),定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé),它是具體構(gòu)件和抽象裝飾類的共同父類。
- ConcreteComponent(具體構(gòu)件),它是抽象構(gòu)件類的子類,用于定義具體的構(gòu)件對(duì)象,實(shí)現(xiàn)了在抽象構(gòu)件中聲明的方法,裝飾器可以給它增加額外的職責(zé)(方法)。
- Decortor(抽象裝飾類),維持了一個(gè)Component引用,并定義了一個(gè)與Component 接口一致的接口。
- ConcreteDecortor(具體裝飾類),它是抽象裝飾類的子類,負(fù)責(zé)向構(gòu)件添加新的職責(zé)。每一個(gè)具體裝飾類都定義了一些新的行為,它可以調(diào)用在抽象裝飾類中定義的方法,并可以增加新的方法用以擴(kuò)充對(duì)象的行為。
我們先來定義Component,可以是接口或者抽象類
public interface Component {
void operation();
}
接下來是ConcreteComponent ,是 Component 的實(shí)現(xiàn)類
public class ConcreteComonpent implements Component{
@Override
public void operation() {
System.out.println("This is the Concrete Component");
}
}
其次是 Decortor 類,這里維持了一個(gè) 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 類,它們都是具體的裝飾對(duì)象,起到給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 方法就是這個(gè)類當(dāng)中的。首先,我們來看一下 Context 的繼承結(jié)構(gòu)。
Context繼承結(jié)構(gòu).jpg
簡(jiǎn)直和上圖的裝飾模式 UML 一模一樣。
- Context 對(duì)應(yīng)著 Component
- ContextImpl 對(duì)應(yīng)著 ConcreteComponent
- ContextWraper 對(duì)應(yīng)著 Decorator
- Activity、Application、Service、ContextThemeWrapper 對(duì)應(yīng)著 ConcretDecorator。
參考資料
[1] PleaseCallMeCoder. 從裝飾者模式到Context類族
[2] Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides. 設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M]. 李英軍等譯.北京:機(jī)械工業(yè)出版社,2009.
[3] 程杰. 大話設(shè)計(jì)模式[M]. 北京 : 清華大學(xué)出版社 , 2007.