裝飾模式又名包裝模式琐鲁。裝飾模式以對客戶端透明的方式擴展對象的功能菠齿,是繼承關系的一個替代方案。
動態(tài)地給一個對象添加一些額外的職責熙宇,就增加功能來說鳖擒,裝飾模式比生成子類更靈活。
原理:
增加一個修飾類包裹原來的類烫止,包裹的方式一般是通過在將原來的對象作為修飾類的構造函數(shù)的參數(shù)蒋荚。裝飾類實現(xiàn)新的功能,但是馆蠕,在不需要用到新功能的地方期升,它可以直接調用原來的類中的方法。修飾類必須和原來的類有相同的接口互躬。
好處:
- 使主功能和附加功能相分離播赁,可獨立擴展。
- 降低主功能和附加功能之間的耦合性吼渡。
模式中的角色
類圖:
image
2.1 抽象構建(Component):定義一個抽象接口行拢,用以給這些對象動態(tài)地添加職責。
2.2 具體構建(ConcreteComponent):定義一個具體的對象,也可以給這個對象添加一些職責舟奠。這個類是主功能類竭缝。
2.3 裝飾類(Decorator): 裝飾抽象類,繼承了Component,從外類來擴展Component類的功能沼瘫。
2.4 具體裝飾者(Decorator1,2,3):負責給構建對象添加職責抬纸。附加功能類。
下面是具體代碼實現(xiàn):
抽象構件類:裝飾類的公共接口
public interface Component {
void sampleOperation();
}
具體構件類(主功能類):
public class ConcreteComponent implements Component{
public ConcreteComponent() {
}
@Override
public void sampleOperation() {
/*
* 實現(xiàn)主功能
*/
System.out.println("ConcreteComponent");
}
}
裝飾類(所有附加功能類的父類):
public class Decorator implements Component{
protected Component component;
public Decorator(Component component) {
this.component = component;//component為對另一個類對象的引用
}
public Decorator() {}
@Override
public void sampleOperation() {
/*
* 實現(xiàn)附加功能
*/
component.sampleOperation();
}
}
具體裝飾類(附加功能類):Decorator1
public class Decorator1 extends Decorator{
public Decorator1(Component component) {
super(component);
}
@Override
public void sampleOperation() {
/*
* 實現(xiàn)附加功能
*/
System.out.println("Decorator1");
component.sampleOperation();
}
}
具體裝飾類(附加功能類):Decorator2
public class Decorator2 extends Decorator {
public Decorator2(Component component) {
super(component);
}
@Override
public void sampleOperation() {
/*
* 實現(xiàn)附加功能
*/
System.out.println("Decorator2");
component.sampleOperation();
}
}
具體裝飾類(附加功能類):Decorator3
public class Decorator3 extends Decorator{
public Decorator3(Component component) {
super(component);
}
@Override
public void sampleOperation() {
/*
* 實現(xiàn)附加功能
*/
System.out.println("Decorator3");
component.sampleOperation();
}
}
客戶端:調用了Decorator1的sampleOperation()耿戚,實現(xiàn)了四個功能湿故。
public class TestDecorator {
public static void main(String[] args) {
//定義主功能類
ConcreteComponent c = new ConcreteComponent();
//定義三個附加功能類。
Decorator1 d1 = new Decorator3(c);
Decorator2 d2 = new Decorator2(d1);
Decorator1 d3 = new Decorator1(d2);//將三個功能都交給Decorator3
//實現(xiàn)功能
d1.sampleOperation();
}
}
輸出:
Decorator3
Decorator2
Decorator1
ConcreteComponent
總結:
優(yōu)點:
- 比靜態(tài)繼承更靈活 與對象的靜態(tài)繼承相比膜蛔,Decorator模式提供了更加靈活的向對象添加職責的方式坛猪,可以使用添加和分離的方法,用裝飾在運行時刻增加和刪除職責.
- 降低主功能和附加功能之間的耦合性皂股。
- 降低了主功能類的復雜度墅茉,遵循了開閉原則。
適用情景:
- 當需要為已有功能動態(tài)地添加更多功能時呜呐。
- 類的核心功能無需改變就斤,只是需要添加新的功能時。