动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性。
先写一个被装饰者食物的类
被装饰者-食物类
/**
 * 被装饰者-食物类
 */
public class Food {
    private String foodName;
    public Food() {
    }
    public Food(String foodName) {
        this.foodName = foodName;
    }
    public String make() {
        return foodName;
    }
}再定义几个装饰者类
装饰者-面包类
/**
 * 装饰者-面包类
 */
public class Bread extends Food {
    private Food food;
    public Bread(Food food) {
        this.food = food;
    }
    public String make() {
        return food.make() + "+面包";
    }
}装饰者-奶油类
/**
 * 装饰者-奶油类
 */
public class Cream extends Food {
    private Food food;
    public Cream(Food food) {
        this.food = food;
    }
    public String make() {
        return food.make() + "+奶油";
    }
}装饰者-蔬菜类
/**
 * 装饰者-蔬菜类
 */
public class Vegetable extends Food {
    private Food food;
    public Vegetable(Food food) {
        this.food = food;
    }
    public String make() {
        return food.make() + "+蔬菜";
    }
}测试装饰者模型
public class DecoratorDemo {
    public static void main(String[] args) {
        Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));
        System.out.println(food.make());
    }
}运行结果
香肠+奶油+蔬菜+面包
Process finished with exit code 0这就相当于生活当中制作三明治的过程,我们先加一根香肠,再香肠上抹上一层奶油,再加上几片蔬菜,最后拿面包夹上。
装饰者模型就是动态地添加更多功能的一种方式,是一种组合和委托的思想,但是会导致设计中出现许多小类,如果过度使用,会让程序变得很复杂,难以看明白。