00:02
看一下装饰者模式的定义。那装饰者模式它的一个定义是什么呢?我们来看一下,装饰者模式指的是动态的。将新功能附加到对象上。在对象功能扩展方面呢,它比继承更加有弹性,装饰者模式也体现了开辟原则,就是前面我们讲的OCP原则,我们这里提到的将动态的新的功能附加到对象上,和OCP原则呢,后面我们在代码上会。会具体的体现出来。所以说这个装饰者模式,如果我们只是通过这个语言来描述,我相信大部分同学也不太明白是什么含义,就是他就一句话是吧,动态的将新的功能附加到对象上。那这个太难理解了。所以说我呢,这画了一个装饰者模式的原理图,大家看能否理解。嗯,大家想一想哈,呃,同学们呢,这个在实际的生活中都应该用过快递。
01:05
大家都应该用过快递,比如说你要寄一个东西出去。那现在假如我们要去邮寄。我们要去邮寄一个一个物品,假如你现在要去邮寄的是陶瓷。或者是你要邮寄的是一件衣服。你在邮寄这一个产品啊,这这个物品的时候,你是不是先要包装一下。肯定要包装一下,你不能说你要去,比如说你要去给你的朋友邮寄,邮寄一个瓷娃娃。瓷器你不能直接就把这个东西寄过去,人家也不收啊,那怎么办呢?是不是你先包装一下,你根据你的这个物品不同,你可能选择不同的包装方式,比如说陶瓷,你可能会用这个泡沫。是吧,塑料泡沫加这个报纸加木板一起把它组合包装我们的陶瓷,因为陶瓷容易碎嘛。
02:00
假如说你现在邮寄的是一件衣服,你可能就没有不需要那么谨慎了,衣服因为相对来说它不容易被打碎嘛,所以说你可能用报纸把它填充一下,或者用纸板填充一下就可以了,打包就直接出去了,同学们可以看到这个主体。同学们看到这个主体,这个主体就是相当于是我在我们装饰者模式,它就充当了什么呢?充当的被装饰者。他就是被装。被装饰者。OK,那我们这个报纸塑料纸板,木板就是什么呢?就是装饰者。这个就是装饰者,好,我这已经写了,对,呃,Decor。Decor decor,这个就是我们的装饰者。那么不管你是主体还是包装,其实他们都称之为component,为了将这两者能够关联起来,管理呢,我们会做一个抽象的类,叫component,叫主体,他们呢,有我们的这个。
03:03
这个装饰者,还有我们的主体都会去继承它,这两者都成为component的子类。OK,那这个为什么要这么去做?待会在案例里面大家能够明显的体现出来它的一种好处。那同学们再来看,在我们这个原理图里面还出现了这个东西,Concrete component和decor。那刚才我们来简单说一下这两个的含义,首先我们先说concrete component,它是一个具体的主体,如果反映到我们前面这个案例,那这个concrete component就是我们的单品咖啡,比如说呃,前面我们讲的这个d Co就是无音咖啡,或者是espresso,这个就是我们的单品咖啡。那装饰者是什么呢?就是同学们看到decorator,这个就是装饰者,就是我们的各种调料。那有些同学有你如果认真的同学,你们会发现一个特别有意思的现象。
04:00
它是怎么样呢?你看啊,特别像这样,这是我们的装饰者,装饰者里面你们有没有发现它聚合了。它聚合了一个component,而这个component大家想,因为它是这个component是一个是上面的一个这个负类,负类,那也就是说我们这个具体的。这个component是可以放到我们装饰者里面的,大家有没有发现这个特点,也就是说我们将来这个装饰者。这个这个对象里面呢,可以包含我们这个被装饰者。大家明白什么意思了吧?诶就说相当于说这边是调料,调料调料这个类里面呢,包含了我们的被装饰的,就是我们单品咖啡,它是这种思思路做过来的,不像我们想象的,像原先想的啊,我这有单品咖啡,原先我们是这样想的嘛,单品咖啡这是调料。是吧,然后我把调料往这个单品咖啡里面放,我们原先最传统方法这样写,但是这样写呢,其实会很麻烦,反过来就容易了,反过来是什么样呢?它是这样子,你这有调料。
05:08
OK,有调料,然后我这个单品咖啡往这里面伸。诶,我把你包裹起来,那这样管理起来是一个反向的一个思考,反而会变得很简单。反而会变的很简单,待会儿呢,大家在我们这个实际的案例里面,你会有。非常深刻的体会,所以这就是设计模式的一种,它的一种力量,而我们往往呢,这种问题还很多,是不是还很多吧?那同学们看,在如图中,Component,还有componentcre component之间,我们在这之间哈,同学们看,Component和这个or component,呃,这个之间就是我们说的这个之间。Component和这个之间,如果说如果说有很多哈,就是像这个concrete component类很多,我们还可以设设计个缓冲层,我这没话。将共有的部分提取出来,也就是说如果我们单品咖啡很多的话呢,那就会造成这个concrete component很多,那这个时候我们可以再抽象一个类。
06:08
OK。啊,这样是不是听起来很很抽象啊,同学们好,没关系啊,同学们,我们因为我们这儿只是做一个先做一个原理的解释,下面呢,我们就来走一个实际的案例了,就是我们用装饰者模式来解决前面的这个星巴克订购问题,那么大家一目而了然好了,那关于这个装饰者模式的原理先跟同学们聊到这儿,下面呢,我们就准备用代码。用装饰的模式来解决星巴克的咖啡订购问题。
我来说两句