概念
動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生存子類更爲靈活。
使用裝飾模式時,將上一步裝飾地結果作爲參數傳入到下一步地裝飾中。
代碼
要裝飾的對象
public class SunWukong {
public void show(){
}
}
抽象的裝飾類
public abstract class Finery extends SunWukong {
protected SunWukong sunWukong;
public void decorate(SunWukong sunWukong){
this.sunWukong = sunWukong;
}
@Override
public void show() {
if (this.sunWukong != null) {
this.sunWukong.show();
}
}
}
具體的裝飾類一
public class HupiSkirt extends Finery {
@Override
public void show() {
this.sunWukong.show();
System.out.println("穿上了虎皮裙");
}
}
具體的裝飾類二
public class JinguStick extends Finery {
@Override
public void show() {
sunWukong.show();
System.out.println("拿起了金箍棒");
}
}
具體的裝飾類三
public class ZijinCrown extends Finery {
@Override
public void show() {
sunWukong.show();
System.out.println("戴上了紫金冠");
}
}
開始裝飾
public class Client {
public static void main(String[] args) {
SunWukong sunWukong = new SunWukong();
HupiSkirt hupiSkirt = new HupiSkirt();
JinguStick jinguStick = new JinguStick();
ZijinCrown zijinCrown = new ZijinCrown();
System.out.println("+++++穿戴一+++++");
hupiSkirt.decorate(sunWukong);
jinguStick.decorate(hupiSkirt);
zijinCrown.decorate(jinguStick);
zijinCrown.show();
System.out.println("+++++穿戴二+++++");
zijinCrown.decorate(sunWukong);
hupiSkirt.decorate(zijinCrown);
jinguStick.decorate(hupiSkirt);
jinguStick.show();
}
}
// +++++穿戴一+++++
// 穿上了虎皮裙
// 拿起了金箍棒
// 戴上了紫金冠
// +++++穿戴一+++++
// 戴上了紫金冠
// 穿上了虎皮裙
// 拿起了金箍棒
特點
使用裝飾模式裝飾對象時,不需要事先知道裝飾的順序,因此可以動態地裝飾對象。