学习第十一章的时候,感觉所有模式当中最不好理解的应该就是装饰器
老师讲基本思想的时候感觉自己跟的很好
快讲到例子的时候突然发现自己落下了,没跟上老师的思路
自己下课复习讲义的时候看例子觉得不太好理解
问同学同学也没理解的也不是很清晰
于是我自己检索了一下,又认真理解了一下讲义上的例子
整理了一下我的思考
首先分析一下装饰器模式的基本思想:
假设我们现在有一个类Stack
我们通过不同子类如下来实现不同的功能
但如果我们需要特性的任意组合呢?
我们可能有两种想法:1.使用继承 2.复制粘贴所需方法
第一种有明显的问题,一个类只能有一个父类,不能胡乱继承,有很大限制
第二种可能会导致同一段代码出现在很多类中,在之前的章节中老师明确讲过这是程序员不想看到的,因为可能会导致“牵一发而动全身”——出现一个问题,该段代码所有的副本都要修改
所以这两种都不可行,这时装饰器模式就出现了。
我们实现一个装饰器类,这个类中有一个属性的类型是Stack
这相当于一种委托,装饰器可以通过这个属性实现Stack下不同子类的不同功能的组合
下面分析一个例子来详细说一说
直接看用户代码
对象a的类型是PlainIceCream,是基本实现类
对象b的类型是CandyTopping,其属性Icecream input的类型是PlainIceCream
对象c的类型是PeanutTopping,其属性Icecream input的类型是CandyTopping
对象d的类型是NutsTopping,其属性Icecream input的类型是PeanutTopping
这时d调用AddTopping方法 P.S.以下是CandyTopping的AddTopping方法,只是输出不同
首先执行input.AddTopping();,其属性Icecream input的类型是PeanutTopping,所以调用PeanutTopping的AddTopping方法,形式又是如上所示,又会执行input.AddTopping();
以此类推,把套娃一层层打开
一直到a的AddTopping,只是输出语句,这种类似于递归的结构停止
最后的输出结果为