定義
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴(kuò)展對象的功能。
為什么要使用裝飾者模式
- 在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責(zé)。
- 處理那些可以撤消的職責(zé)。
- 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的 子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。
角色
- 抽象組件:定義一個抽象接口,來規(guī)范準(zhǔn)備附加功能的類
- 具體組件:將要被附加功能的類,實現(xiàn)抽象構(gòu)件角色接口
- 抽象裝飾者:持有對具體構(gòu)件角色的引用并定義與抽象構(gòu)件角色一致的接口
- 具體裝飾:實現(xiàn)抽象裝飾者角色,負(fù)責(zé)對具體構(gòu)件添加額外功能。
實例
抽象組件
public interface Shape {
void draw();
}
具體組件
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("shape: rectangle");
}
}
抽象裝飾者
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
具體裝飾
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw(){
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
測試代碼
public class Test {
public static void main(String[] args) {
Shape shape = new Rectangle();
ShapeDecorator decorator = new RedShapeDecorator(shape);
decorator.draw();
}
}
運(yùn)行結(jié)果
shape: rectangle
Border Color: Red