[设计模式笔记]二. 结构型模式--10.Decorator模式(装饰模式)(一)

Decorator(装饰)模式(对象结构型模式)

一. 意图


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


二. 适用性


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

2. 处理那些可以撤消的职责.

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


三. 模式结构


图1 


四. 角色说明


Component

—定义一个对象接口,可以给这些对象动态地添加职责。

ConcreteComponent

—定义一个对象,可以给这个对象添加一些职责。

Decorator

—维持一个指向Component对象的指针并定义一个与Component接口一致的接口.

ConcreteDecorator

—向组件添加职责

Decorator将请求转发给它的Component对象并有可能在转发请求前后执行一些附加的动作.


五. 说明


对一个已经封装好的功能增加功能因为已经封装好了你不可能在它的内部进行修改现在就有两种方式

1. 使用继承生成一个该功能的子类这个子类的要求肯定是要实现父类的接口(父类公开出来的方法).(因为父类已经在用了).

然后对父类对应的方法进行功能扩展.(在父类的方法里面你喜欢怎样就怎样了).

2. 生成一个类该类包含该原功能类的对象这个类同样实现原功能类的接口.(新类中对应的接口调用对象对应的接口).

(新类与功能类继承与同一接口这样原来的用户就不需要改动代码.)(这就是Decorator模式了)

使用Decorator模式时应注意以下几点:

1. 接口的一致性 装饰对象的接口必须与它所装饰的Component的接口是一致的因此,所有的ConcreteDecorator类必须有一个公共的父类.

2. 没有抽象的Decorator因为你常常需要处理现存的类层次结构而不是设计一个新系统, DecoratorConcreteComponent位于同一类层次即可(继承于同一父类). 

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

4. 改变对象外壳与改变对象内核我们可以将Decorator看作一个对象的外壳它可以改变这个对象的行为另外一种方法是改变对象的内核例如Strategy模式就是一个用于改变内核的很好的模式.


我的理解


1. 有一个类你不能改变它的内部实现但是需要扩展它的功能.你可以使用一个新类新类包含一个原类的对象在调用对象的方法前后扩展它的功能有一个问题原类已经再使用了它的接口已经被客户使用了我们扩展它的功能的前提是尽量的让客户少改代码少改变如果原类的功能方法不是继承接口的(原类没有父类或者说原类提供给客户的方法不是接口), Decorator模式无法使用的ConcreteComponentDecorator必须有相同的接口(要扩展功能所对应的那个接口).


2


2. Decorator中包含一个ConcreteComponent对象, Decorator::Operation中调用ConcreteComponent::Operation.

ConcreteDecorator::Operation调用Decorator::Operation (可以看到ConcreteComponentConcreteDecoratorDecorator隔开了解耦了).

这样隔开效果非常明显在类层次上, 我可以横向的扩展ConcreteComponent的功能(增加ConcreteDecorator). 如果使用纵向扩展(类继承), 一条长长的类继承链, That's not a good idea.

3. Decorator中定义的是一个Component指针而不是一个ConcreteComponent指针也就是Decorator不是针对某个ConcreteComponent类扩展而是可以针对所有的ConcreteComponent来扩展.(这一点可以区分Proxy代理模式它就是针对某个类的)

4. ConcreteDecorator::Operation中你可以根据你的需求随便修改甚至Decorator::Operation你也可以不调用看需求吧.


相关模式


1. Adapter模式:Decorator模式不同于Adapter模式因为装饰仅改变对象的职责而不改变它的接口而适配器将给对象一个全新的接口.

2. Composite模式可以将装饰视为一个退化的仅有一个组件的组合然而装饰仅给对象添加一些额外的职责—它的目的不在于对象聚集.

3. Strategy模式用一个装饰你可以改变对象的外表Strategy模式使得你可以改变对象的内核这是改变对象的两种途径.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值