结构型模式——Decorator 装饰器(理论篇)
结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式)。这些结构模式,它们在某些方面具有很大的相识性,仔细推敲,侧重点却各有不同。
Decorator:在已有的对象中动态地加入新功能,或移除已有的功能。
特点:
原始对象对装饰一无所知;
不需要引入一个包含各种装饰选项的特性类;
多个装饰类之间彼此独立;
多个装饰类可以以一种“混搭”(mix-and-match,混合匹配)的方式组合到一起。
n 核心:客户可以互换使用组件对象或装饰器对象。
n 工作方式:重写所需的操作。
正文
Decorator,分为三个部分:组件、装饰器、操作。
既然我们是中国人,那么就要用中国人的思维去理解。首先我们先来举例说明一下,什么是装饰器?现在笔者给出4个“笔画”(这个比喻不是很恰当)。
1、横,一;
2、竖,丨;
3、撇,丿;
4、点,丶;
暂时撇弃一切有关于编程的东西,我们的目的很简单——任意组合。例如下面组合:
组合序号 |
结果 |
1,1,1 |
三 |
1,1,2 |
土、士、干、工 |
4,1,1,1,2 |
玉、主 |
1,2 |
十 |
表 1
上面的组合,只是一个简单的示例,结果可能更多。
首先,什么是组件?记得小时候的我们,学写字的“正楷作业本”(如果我记错,请不要怪罪,我忘了。)?那作业本里就是一个“组件集合”,每一个框框,便是一个组件。我们暂时将“框框”(组件)分为三类:
1、 原始型,框框内空白(口)。
2、 横型,框框内已有一条横线(日)。
3、 竖型,框框内已有一条竖线(倒日)。
这便有三类组件。了解完组件,便不难理解横竖撇点是装饰品。而所谓的“横型、竖型”,无非是原始组件多了一个装饰器。
那么这个“横型”、“竖型”有什么作用呢?俗点讲:你可以少输入一笔。看似无用,其中奥义自去领回。
那么,最后的问题是,什么是操作?我们再次看看 表1 的第三行。汉字“玉、主”,只是一个点之差,但是他们都是组合“4,1,1,1,2”。那么,如何辨别差别呢?最简单的方法,无非是限制输入顺序。可是这里或许可行,但若是 表1 的第二行,这个方法显然行不通了。“土、士”的笔画顺序皆是“1、2、1”。这个时候,便需要一个操作,就像要往一张图片上画上一只动物,那么这个动物需要在画在哪里呢?操作,便是解决了这个问题。
如果说高级一些,装饰器可以拥有一个特点,便是“行为”。最简单的RGB颜色。一张白纸上涂满red,在中间画上一个green的实心圆,那么那个实心圆的颜色,是绿色的么?