适用范围:

我已经有了一个类,但是这个类还不够让我满意,我就拿装饰器给他装饰一下。

代码演示:

  • 假如我去喝咖啡,但是咖啡是苦的,我需要加糖装饰一下
  • 苦咖啡 与 加糖咖啡 都是基于 咖啡接口
  • 即将刚开始的苦咖啡经过加糖咖啡的装饰返回了一杯新的咖啡
  1. 咖啡接口
1
2
3
4
5
6
public interface Coffee {
/**
* 打印当前咖啡的原材料,即咖啡里有什么
*/
void printMaterial();
}
  1. 苦咖啡实现类
1
2
3
4
5
6
public class BitterCoffee implements Coffee {
@Override
public void printMaterial() {
System.out.println("咖啡");
}
}
  1. 默认点餐逻辑
1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Coffee coffee = new BitterCoffee();
coffee.printMaterial();
}
}
  1. 加糖装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 糖装饰器,用来给咖啡加糖
*/
public class SugarDecorator implements Coffee {

/**
* 持有的咖啡对象
*/
private final Coffee coffee;

public SugarDecorator(Coffee coffee) {
this.coffee = coffee;
}

@Override
public void printMaterial() {
System.out.println("糖");
this.coffee.printMaterial();
}
}

5.加糖成功

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Coffee coffee = new BitterCoffee();
coffee = new SugarDecorator(coffee);
coffee.printMaterial();
}
}

与代理模式的差别:

  • 两者实现的都是对原对象的包装,持有原对象的实例,差别在于对外的表现。

  • 装饰器模式:点了咖啡,发现太苦了,不是自己想要的,然后用装饰器加了点糖。

    1
    2
    Coffee coffee = new BitterCoffee();
    coffee = new SugarDecorator(coffee);
  • 代理模式:直接就点的加糖咖啡。
    1
    Coffee coffee = new CoffeeWithSugar();