设计模式学习总结:装饰者模式(Decorator Pattern)

意图

动态地给一个对象添加一些额外的职责,就增加功能而言,其比继承更为灵活。

适用性

  1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  2. 处理那些可以撤销的职责
  3. 当不能采用继承进行扩展时

结构

这里写图片描述
Component为被装饰对象,Decorator为装饰类。

优缺点

优点

1> 比静态继承更灵活。Decorator模式提供了更加灵活的向对象添加职责的方法。可以用添加和分离的方式,用装饰在运行时增加或删除职责,相比之下,继承机制则需要为每个添加的职责创建一个子类。并且Decorator模式可以很容易地重复添加一个特性。
2> 避免层次结构高的类有太多的特征。Decorator模式提供了一种“即用即付”的方法来添加职责,这样你可以定义一个简单的类,然后用简单的组件组合出复杂的功能,这样应用程序就不会为不需要的特征付出代价。暗暗切合了“多用组合,少用继承”的编程原则。

缺点

采用Decorator模式往往会产生很多看上去类似的小对象,尽管对于了解这些系统的人来说,可以很容易的定制自己想要的对象,但是对于不了解系统的人,学习这样的系统将较为困难,拍错也会比较困难。

实现

1> 接口的一致性。装饰对象的接口必须与它所装饰的Component的接口一致,因此所有Decorator类必须要有一个公共的父类(至少在c++中是如此的)
2> 省略抽象的Decorator。当你仅需要添加一个职责时,没有必要定义一个抽象的Decorator类。
3>保持Component类的简单性。为了保持接口的一致性,组件和装饰必须要有一个公共的父类Component,因此保持这个类的简单是很重要的。Component应集中于定义接口而不是存储数据,对数据的定义应该延迟到子类中,否则Component类会变得过于复杂庞大而使其难以被复用。
4>改变对象的外壳和改变对象的内核。我们可以将Decorator看做是一个对象的外壳,那么相对的Strategy则可以看做是一个对象的内核。Decorator模式仅从外部改变组件,因此组件对其装饰不需要有任何了解,但是装饰的接口必须与组件的接口一致;而Strategy模式中,组件本身知道可能进行哪些扩充,因为它必须引用并维护相应的策略,因此一个Strategy可以用自己的接口。当Component类本身就很庞大时,使用Decorator的代价将会较大,这时使用Strategy模式是一个不错的方法。

实例

相关模式

Adapter(适配器)模式:Decorator模式仅改变对象的职能而不改变对象的接口,与之对应Adapter模式不改变对象的功能,但是给对象适配了一套全新的接口。
Composite(组合)模式:可以将Decorator视为一个退化的、仅有一个组件的组合,但是Decorator主要注重于给对象添加一些额外的功能,而Conposite模式则注重对象聚集。
Strategy(策略)模式:Decorator用于改变对象的外壳,而Strategy用于改变对象的内核。这是改变对象的两种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值