举例:
蛋糕店 能够生产格式各样的蛋糕
蛋糕分为 三种 : 奶油蛋糕 ,巧克力蛋糕, 冰淇淋蛋糕
然后再上面可以添加 鲜花 水果 贺卡 干果 饼干…
不同的人可以定做不同的蛋糕,有不同的选项
蛋糕店用不用将所有选项的排列组合的蛋糕都准备一遍???没有必要!!!
蛋糕制作接口:
abstract class Cake{
public abstract void make();
}
选择口味:
class ChocklateCake extends Cake{
public void make() {
System.out.println("制作了一个巧克力蛋糕");
}
}
class CreamCake extends Cake{
public void make() {
System.out.println("制作了一个奶油蛋糕");
}
}
class IcecreamCake extends Cake{
public void make() {
System.out.println("制作了一个冰淇淋蛋糕");
}
}
添加饰品:
class CardDecorator extends Decorator{
public CardDecorator(Cake cake) {
super(cake);
}
public void make(){
super.make();
System.out.println("放入一张card");
}
}
class FruitDecorator extends Decorator{
public FruitDecorator(Cake cake) {
super(cake);
}
public void make(){
super.make();
System.out.println("放上一点水果");
}
}
class NutDecorator extends Decorator{
public NutDecorator(Cake cake) {
super(cake);
}
public void make(){
super.make();
System.out.println("放上一点干果");
}
}
测试代码:
public static void main(String[] args) {
Cake cake=new ChocklateCake();
FruitDecorator fd=new FruitDecorator(cake);
NutDecorator nd=new NutDecorator(fd);
CardDecorator cd=new CardDecorator(nd);
cd.make();
}
结果:
制作了一个巧克力蛋糕
放上一点水果
放上一点干果
放入一张card
总结:
优点:
- 装饰类和被装饰类是可以独立的,低耦合的。互相都不用知道对方的存在
- 装饰模式是继承的一种替代方案,无论包装多少层,返回的对象都是is-a的关系(上面的例子:包装完还是Phone类型)。
- 实现动态扩展,只要继承了装饰器就可以动态扩展想要的功能了。
缺点:
- 多层装饰是比较复杂的,提高了系统的复杂度。不利于我们调试~