00:01
我们把装饰者模式讲的内容呢,还是老规矩进行一个简单的梳理,我们看一下装饰者模式我们是怎么一步一步给大家进行讲解的,来看一下。一边讲呢,仍然是一边做我们的笔记,对吧,通过这个笔记把它梳理梳理来。加一个分页符,现在我们这讲的是装饰者模式。装饰者模式,那么装饰者模式呢,我们仍然是先通过了一个项目或者一个需求来引起同学们对这个问题的怎么呀思考,说星巴克呢,有一个咖啡的什么呀,订,呃,这个订咖订单的这么一个问题。嗯,而且这边提出了具体的要求,于是我们就提出了第一个方案。虽然第一个方案呢,比较呃比较差,但是但是呢,他也算是一个方案,对于我们没有学设计模式的同学,其实你更容易想到的就是第一个方案。
01:00
对不对,我们第一个想到的方案就是他嘛,就是用我们的继承嘛。这是一种很自然的想法,自然你自然就会想到是这个方法,虽然它不好,对不对,所以说我们对这个方案呢,我们做了一些分析,就是它存在的问题是什么。于是我们分析了他的问题,我们说一个模式好,一个模式不好,肯定是因为它解决了一些问题,是不是好啊,对,这个还是标签。他的问题是什么呢?我在这里做了一些分析。最终我们得出的结论就是这样子的结论。就是这样设计呢,会有很多类当,而且当我们增加一个单品咖啡,或者增加一个新的调料调味品的时候呢,数类的数量就会增加,就会出现一个类爆炸。就那会变得越来越多,而让我们这个程序呢,无法控制,就是维护起来很难。代码看起来也很麻烦。好,这是我们的问题所在,紧接着我们提出了怎么样第二一个方案。
02:03
第二个方案虽然呃也不是最好的,但是呢,他比第一个方案应该说怎么样还是要好一点,对吧,虽然他不是最好的,但是它多少还是要好一点的,我们把这个呢也给大家整理一下,对。这第二个方案呢,它是怎么做的,我们来看一下这个图。好,同样,这是第二。对,呃,我们这画了一个类图来描述,说怎么办呢,我们把这一个。调味品就把调味的milk so,怎么样把它放到我们这个里面去,那这样子的话呢,每一个子类一旦继承了drink,也就继承了他所有的调味品,然后通过相应的方法来控制。他有还是没有,并且进行成本的计算,对吧,所以这个方案呢,应该说比第一个方案还是要优越一些,还是要好一些,至少对不对,还是要好一些,但是这个方案呢,仍然存在一些问题,这个问题呢,我们在下面做了分析,什么问题呢?就是这样的,就是。
03:05
他如果增加和或者是删除一些调料种类的时候呢,代码的维护量仍然是很大,所以说我们对这个问题呢,也还是不满意。对吧,尽管比前面好了,但是呢,我们认为还是不满意,所以说我们引出了要讲解的什么呀。装饰者模式就这样引出来了。经出装饰者模式了,那在讲装饰者模式的时候呢,首先我们仍然是先给同学们介绍一下装饰者模式的定义是什么?就它的定义是什么。对吧,你要对它做一个基本的了解,它的定义呢,其实特别简单,就一句话,就说动态的将新功能附加到对象上。就这句话。这怎么动态添加,呃,懂怎么动态的将新功能附加,对象上没有说的很清楚,所以说这个理解起来不是很到位,而且呃,而且他也说了装饰者模式体现出这个OCP原则,你也很难理解,怎么办呢?我们就这样做的,我们首先画了一个原理图。
04:10
对吧,我们说诶这个原理图呢,可能对我们理解有些帮助,所以说我们先画了一个图。来把这个。它的原理图先给大家拿过来,这边我们做了这样几个介绍,第一个。对吧,第二个我们这儿做了他的一些说明。这是主体。这样做了一个component说明,然后这边呢。另外几个说明好,装饰者说明。好,然后这边我们对应的一个图,我把这个图呢给他拿过来,大家一看就一目了然了。往这边挪一下,好图在哪里呢?就是这个图。这个图其实就是描述了什么呀,描述了我们装饰者模式的一个原理,大家可以看到这个地方就是我们的component这边,就是我们具体的这个实现了component的这种。
05:00
这这个子类,然后这边是装饰者这条线中间这个地方呢,可以有一个缓冲层。比如说我们这个具体的concor component比较多,我们可以抽抽象出来一层,比如说在刚才在下面我们抽象出来一个咖啡是这样子的吧,好,这是他的一个示意图,我们聊到这里。这是它的原理图。把原理图放这大家就很清晰了,有了这个原理图做支撑呢,下面呢,我们就来使用了装饰者模式解决我们。这个星巴克咖啡的一个订单是这样子的吧,好,这个图呢,我就一次性拿过来,好吧,就不多说了。这个图还是比较清晰的,把我们的一个设计方案展现出来了。对吧,说这边是我们的单品咖啡,这边是我们的装饰者及我们的调味品。是这样子吧,同学们好,然后有了这样一个东西过后呢,我们又做了一个具体的分析,就是说如果我们是买了一份。
06:05
单品咖啡下面呢,呃,我们又加了两份巧克力和一份牛奶,他从这个原理图来看是谁呢?是先点单品咖啡,再用我们的装饰者去包裹它,诶是这样一种逻辑,是不是同学们好,这是我们说的这么一个流程。好的,呃,那么这块呢,我们也快速的把这个图截过来即可。OK啊同学们,这是我们这个它的一个示意图的说明,那有了这个示意图过后呢,我们就用代码把这个实现了一下。好的代码实现了一下。那具体来说,这个代码是怎么走的呢?具体来说这个代码是怎么走的,我这来一个标题是这样写的。在这写的对不对?在这里面我们写了一个decor,里面代码的文件很多,肯定我就不一个个粘贴了,我仍然按照以前的套路,把这个文件夹给大家压缩到这里就可以了。
07:02
这样大家到时候一看就明白,诶是这样来完成的,对不对,好,那这个说完了以后呢,我们就又做了一个相对深入一点分析,说我们在JDK的IO这个体系里面呢,诶我们也用到了装饰者模式。啊,也用到装饰者模式,好,我把这个呢捋到这里来。那具体来说是怎么用呢?就是这有一张图。这张图呢,描述了我们这个IO的一个装饰的情况,是这样子吧,就是IO它是怎么实现这个装饰者模式的,好这边呢有一段源码我也写了,因为这个这个源码比较少,我就放过来了,源码分析源码的一个对应。源码梳理。好圆码呢,我就从这个位置给大家粘过来,诶在哪呢,在这是不诶。在JDK里面的decor这里面说了六点。把这个IO里面用到的装饰者模式的角色,咱们进行了一个分析。
08:03
和说明。来加入一个表格就可以了。好,同学们,那关于装饰者模式我们就给大家讲到这里,大家好好去去领会一下,个人认为装饰者模式在我们开发中还是非常有用的,它可以解解决很多问题,既满足了OCP,同时呢,让我们这个类也变得比较少,利于我们代码的维护,还是一个非常优秀的装饰模式啊,这个装饰模式还非常优秀的。好,那关于这个装饰的模式就给大家讲解到这里。
我来说两句