Decorator(装饰器,Structural Pattern)
问题:点咖啡系统
- 如果我们要编写一个点咖啡系统
- 只有四种咖啡的类图如下
- 如果要给咖啡加调料,而且每一种都要收钱,最后还要算钱,该咋办呢
- 如果还是搞很多个类,会产生“类爆炸”
- 我们也可以给父类增加许多方法来避免类爆炸
- 可是如果我们要改价格或者加新的调料该咋办呢?
装饰器模式
这是啥
- 一层层剥开你的心
- 简而言之,每新增一种调料就把咖啡用调料装饰,也就是放进调料对象中,增加新的调料就把之前产生的对象放进新的调料
- 计算价格时只要一层层剥开就好了
为啥
- 动态添加职责
- 相比通过继承来添加功能更加灵活
- 也叫“Wrapper”,包装类
- 起初是为了方便向GUI中添加组件,所以利用了组合的方式
实现
- 组件
- 实体组件
- 装饰器
- 实体装饰器
优缺点
- 优点
- 比静态继承灵活
- 避免类爆炸
- 可以创造许多行为
- 缺点
- 被装饰的组件和组件本身已经不同了,变成了装饰器的类型
- 会产生很多对象
咖啡系统的实现
实例:JAVA I/O