【设计模式】——Decorator装饰模式

 

意图

l  动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

UML

装饰模式UML

适用性

l  在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

l  处理那些可以撤消的职责。

l  当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

主要优缺点

1)         比静态继承更灵活与对象的静态继承(多重继承)相比, D e c o r a t o r模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。相比之下,继承机制要求为每个添加的职责创建一个新的子类(例如, B o r d e r S c r o l l a b l e Te x t Vi e w, BorderedTe x t Vi e w)。这会产生许多新的类,并且会增加系统的复杂度。此外,为一个特定的C o m p o n e n t类提供多个不同的D e c o r a t o r类,这就使得你可以对一些职责进行混合和匹配。使用D e c o r a t o r模式可以很容易地重复添加一个特性,例如在Te x t Vi e w上添加双边框时,仅需将添加两个B o r d e r D e c o r a t o r即可。而两次继承B o r d e r类则极容易出错的。

2)         避免在层次结构高层的类有太多的特征D e c o r a t o r模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用D e c o r a t o r类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。这样,应用程序不必为不需要的特征付出代价。同时也更易于不依赖于D e c o r a t o r所扩展(甚至是不可预知的扩展)的类而独立地定义新类型的D e c o r a t o r。扩展一个复杂类的时候,很可能会暴露与添加的职责无关的细节

3)         Decorator与它的C o m p o n e n t不一样D e c o r a t o r是一个透明的包装。如果我们从对象标识的观点出发,一个被装饰了的组件与这个组件是有差别的,因此,使用装饰时不应该依赖对象标识。

4)         有许多小对象采用D e c o r a t o r模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难。

注意事项:

1)         接口的一致性装饰对象的接口必须与它所装饰的C o m p o n e n t的接口是一致的,因此,所有的C o n c r e t e D e c o r a t o r类必须有一个公共的父类(至少在C + +中如此)。

2)         省略抽象的D e c o r a t o r类当你仅需要添加一个职责时,没有必要定义抽象D e c o r a t o r类。你常常需要处理现存的类层次结构而不是设计一个新系统,这时你可以把D e c o r a t o rC o m p o n e n t转发请求的职责合并到C o n c r e t e D e c o r a t o r中。

3)         保持C o m p o n e n t类的简单性为了保证接口的一致性,组件和装饰必须有一个公共的C o m p o n e n t父类。因此保持这个类的简单性是很重要的;即,它应集中于定义接口而不是存储数据。对数据表示的定义应延迟到子类中,否则C o m p o n e n t类会变得过于复杂和庞大,因而难以大量使用。赋予C o m p o n e n t太多的功能也使得,具体的子类有一些它们并不需要的功能的可能性大大增加。

4)         改变对象外壳与改变对象内核我们可以将D e c o r a t o r看作一个对象的外壳,它可以改变这个对象的行为。另外一种方法是改变对象的内核。例如, S t r a t e g y ( 5 . 9 )模式就是一个用于改变内核的很好的模式。

示例代码:

图示:

星巴克咖啡示例

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值