概念
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生存子类更为灵活。
使用装饰模式时,将上一步装饰地结果作为参数传入到下一步地装饰中。
代码
要装饰的对象
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();
}
}
// +++++穿戴一+++++
// 穿上了虎皮裙
// 拿起了金箍棒
// 戴上了紫金冠
// +++++穿戴一+++++
// 戴上了紫金冠
// 穿上了虎皮裙
// 拿起了金箍棒
特点
使用装饰模式装饰对象时,不需要事先知道装饰的顺序,因此可以动态地装饰对象。