定义
动态地给一个对象添加一些额外的职责.就增加功能来说,装饰者模式比生成子类更为灵活
装饰者模式是一种对象结构型模式
使用场景
- 在不影响其他对象的情况下,以动态,透明给单个对象添加职责
- 需要动态的给一个对象增加功能,这些功能动态的被撤销
- 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时.不能采用继承的情况主要有两类:第一类是系统中存在大量的独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承
角色
抽象构建角色: 定义一个对象接口或抽象类,可以给这些对象动态的添加职责
具体构建角色: 实际被动态地太假职责的对象
抽象装饰者角色: 实现了Component接口,用扩展Component类的工鞥呢,但对于Component来说,是无需知道Decorator存在的
具体装饰者角色: 动态地添加职责对象
上代码
写一个接口当做父类
public interface Man {
public void getManDesc();
}
再写一个装饰器类,这个类继承Man接口
public class NameDecorator implements Man {
private Man man;
public NameDecorator(Man man){
this.man = man;
}
@Override
public void getManDesc() {
man.getManDesc();
}
}
再写一个"被装饰者"类,
public class SuperMan implements Man {
private String name = null;
public SuperMan(String name) {
this.name = name;
}
@Override
public void getManDesc() {
System.out.println(name);
}
}
再随便写几个修饰条件,我这里写的是有车,有钱,有腹肌
// 有车
public class CarImpl extends NameDecorator {
public String car = "有车";
public CarImpl(Man man) {
super(man);
}
public void addCar(){
System.out.print(car + " ");
}
public void getManDesc(){
super.getManDesc();
addCar();
}
}
// 有钱
public class MoneyImpl extends NameDecorator {
private String deposite = "存款过百";
public MoneyImpl(Man man) {
super(man);
}
public void addDescriptor() {
System.out.print(deposite + " ");
}
@Override
public void getManDesc(){
super.getManDesc();
addDescriptor();
}
}
public class AbdominalDecorator extends NameDecorator {
private String other = "有腹肌";
public AbdominalDecorator(Man man) {
super(man);
}
public void addQuader(){
System.out.print(other + " ");
}
@Override
public void getManDesc() {
super.getManDesc();
addQuader();
}
}
测试类
public void run1 (){
Man man1 = new SuperMan("阿松");
Man man2 = new CarImpl(man1);
Man man3 = new MoneyImpl(man2);
Man man4 = new AbdominalDecorator(man3);
System.out.println("层层装饰");
man4.getManDesc();
System.out.println();
}
输出:
层层装饰
阿松:有车 存款过百 有腹肌
需要哪一条特性就将man1放到哪个属性里,可以看出,要是不new SurperMan("")是无法继续进行装饰的,当然你也可以没车,没钱,没腹肌,也可以有房,有女朋友,有…,