1. 定義
裝飾模式:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō),裝飾模式相比生成子類更為靈活。裝飾模式中,通過(guò)裝飾者給被裝飾者擴(kuò)展了功能。
裝飾模式
2. 使用場(chǎng)景
- 需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類增加附加功能。
- 需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)地撤銷。
- 需要為一批的兄弟類進(jìn)行改裝或加裝功能,當(dāng)然是首選裝飾模式。
- Java中的IO流的架構(gòu)。
- Android中的Context家族。
3. 實(shí)現(xiàn)
被裝飾者的抽象及其實(shí)現(xiàn):
public abstract class Component {
public abstract void operate();
}
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("operate");
}
}
裝飾者的抽象:
public abstract class Decorator extends Component {
private Component mComponent;
public Decorator(Component component) {
mComponent = component;
}
@Override
public void operate() {
//委托給被修飾者去執(zhí)行對(duì)應(yīng)的方法
this.mComponent.operate();
}
}
裝飾者的具體實(shí)現(xiàn):
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
@Override
public void operate() {
decorate1();
super.operate();
}
public void decorate1() {
System.out.println("修飾方法1");
}
}
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component component) {
super(component);
}
@Override
public void operate() {
decorate2();
super.operate();
}
public void decorate2() {
System.out.println("修飾方法2");
}
}
場(chǎng)景類:
public class Client {
public static void main(String[] args) {
Component component = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent()));
component.operate();
}
}
運(yùn)行結(jié)果:
修飾方法1
修飾方法2
operate
4. 優(yōu)點(diǎn)
- 裝飾模式可以動(dòng)態(tài)地?cái)U(kuò)展一個(gè)實(shí)現(xiàn)類的功能。
- 裝飾模式是繼承關(guān)系的一個(gè)替代方案。不管裝飾多少層,最終返回的對(duì)象還是抽象類。
- 裝飾類和被裝飾類可以獨(dú)立發(fā)展,而不會(huì)相互耦合。
5. 缺點(diǎn)
- 多層的裝飾是比較復(fù)雜的。
- 應(yīng)該盡量減少裝飾類的數(shù)量,以便降低系統(tǒng)的復(fù)雜度。