设计模式--装饰者模式

定义

使用组合委托动态的将责任附加到对象上,如果要扩展功能,装饰者提供了比继承更有弹性的替代方案。
通俗来说,装饰者就是一些具有独特用途的小组件,它们依赖于一些基础组件并且具有基础组件的一切功能,而用户可以自己自由的选择不同的装饰者相互组合来实现复杂的多样的功能。
组合:我们先用一个图来简单解释下组合,还用最经典的咖啡来举例:
这里写图片描述

上图中“咖啡店”相当于抽象类(其中“价格”“描述”来自于接口),其中“咖啡”和“调料”相当于基础组件,“深焙咖啡”、“拿铁咖啡”、“牛奶咖啡”、“糖”、“摩卡”、“豆浆”相当于装饰者。用户ABC则依据自己的爱好有了不同的选择:
用户A:深焙咖啡+糖+摩卡
用户B:拿铁咖啡+糖+豆浆
用户C:牛奶咖啡+摩卡+摩卡
我们思考下,用户C选择了两份“摩卡”,相对应的“摩卡”的价格就要计算两次,这是怎么实现的呢?这就依赖于装饰者的委托。就是将当前的“牛奶咖啡”计算过价格之后,在去其基础上再加上摩卡的价格生成新的对象,之后再将新生成的对象为基础来计算最后一个“摩卡”的价格。
委托:就是将一个基础组件经过一个装饰者封装后生成一个新的对象并将其传递给后续的调用或者操作(因为所有的基础组件都继承于抽象类即都实现了具有“价格”和“描述”的接口,故返回的对象都是一样的)的过程,其可以是单次调用,也可以是一个调用链。如用户A的行为用链式调用来表示:
这里写图片描述

Java中的装饰者模式

Java中好多地方使用装饰者模式,我们来看一张图(Head First设计模式中的图,我直接拍下来的):
这里写图片描述
图中解释的非常清楚,InputStream的每个子类都是一个装饰者,Java将每种类型的流都单独写成一个装饰者,然后通过组合各种装饰者来实现各种各样的用途

优缺点

优点:
更低的耦合,为设计提供了更多的弹性。
缺点:
会产生太多的小对象,增加了代码的复杂性,如Java中的输入输出流类对象太多,增加了程序员理解的难度,对学习API的造成了很大的困扰。

总结

  • 能够在不改变原有代码的基础上的通过自有组合为扩展提供了更大的弹性。
  • 此模式意味着会有许多的装饰者类,用来包装具体的组件并且这些装饰者类都能够反映出被包装者的类型(因为都是通过类继承或者接口实现的方式)。
  • 装饰者能够在被包装着之前或者之后加上自己的行为,甚至删除被包装者的行为来达到自己的目的。
  • 会产生大量小对象,如果过度使用此模式会极大的增加代码的复杂度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值