代码改变世界

[AS3/简单理解设计模式]装饰者模式

2011-11-18 00:04  WesleyWoo  阅读(961)  评论(0编辑  收藏  举报

装饰者模式中,所有装饰者与被装饰者都会继承一个共同的基类。这个基类会衍生成两种类别:一种是被装饰的具体类;另一种是用来装饰的装饰类。

举一个可能不是很恰当的例子:“人” 是一个抽象类,我们暂时定义为只是一个人的形状,没有内在的器官,精神等等,因为无法直接创建成一个具体的人。但是我们可以继承“人”这个类,为它添加器官,赋予精神,赋予肤色,使其成为一个可以创建真人的具体类。与此同时,我们也可以继承“人”这个类,为它添置布料,设置颜色,使其成为可以创建“穿着衣服的人”的具体类。于是,“人”这个抽象基类就衍生出来了被装饰类“具体的人”,以及装饰类“穿着衣服的人”:“穿着衣服的人”用来装饰“人”,一件衣服可以给不同的人穿,一个人可以穿不同的衣服,并且,一个人可以同时穿多件衣服,同时展示出多个装饰者的特性。类似的,我们还可以继承“人”这个抽象类,再为其创建其他的装饰者,如“拿着武器的人”、“骑着马的人”等等。

简单来说,装饰者模式有这些特征:

1、所有的装饰者与被装饰者都继承共同的基类,就像上例中所有的类都继承自”人“这个基类;

2、装饰者可以出现在基类抽象类对象出现的任何地方,这点很好理解,因为”穿着衣服的人“、”拿着武器的人“都是人,所以只要是人可以出现的地方,他们都可以出现;

3、装饰者之间可以混合匹配组合,就像穿着衣服的人又可以骑着马,又可以拿着武器一样。

而装饰的整个过程其实与”+=“操作类似,每次装饰,都是将装饰者的属性与被装饰者的属性累加集合起来,就像是一个滚雪球的过程:雪球会越滚越大,滚的过程中会粘上一些其他的杂物(树叶泥土等),可雪球仍然是雪球,虽然体积变大了,但本质没有改变。