00:02
装饰者。这个模式他在JDK应用的源码分析,我们来看一下。这就是说这个装饰者模式啊,他在JDK的这个IO流里边,就是这个better input stream这个东西。他就是一个装饰者,那同学们先看这张图哈,大家不要着急,这个图你刚看呢,可能一时半会看不懂,我给大家分析一下。呃,如果你在使用Java的时候,你会用过。IO流这方面的知识,那同学们可以看到,在IO这个体系里面呢,有个叫input stream。这个类大家都知道这个类是个什么类啊,这是一个抽象类,还记得吗?诶,这是个抽象类,其实这个类就有点类似于我们前面讲的这个drink,你要对比来看就知道了。Drink,那么下面像fire input stream buffer input stream bit input stream等等,像这些呢,就是我们这个input stream的具体的子类,你可以把它认为就是我们的单品咖啡。
01:08
诶,这个就是单品咖啡,我简简写个单。那同学们还在看这个fair input stream,同学们fair input stream它是干什么的呀?它是不是继承了input stream,其实这个东西呢,其实就是有点像我们前面讲的or。对,这个东西也是,也就是他是一个装饰者。那么具体来说,这个这个装饰者里边,它下面的子类,像buffer input stream。Data input stream,像这个这些呢,就有点类似于我们前面讲的什么呀,调味品。我写个条,比如说前面我们讲的milk soy,还有像这个就是chocolate,就属于是的下面具体的之类。说你看这个这个关系就非常的明确,那有些同学就要问了,说老师,那这里边哪个地方会出现我们被双试者呢?如果你追,待会我们追一下源码,你会发现在filter input stream里面,它有它有一个属性,就这个属性。
02:16
就这个属性,大家有没有看到这个protect的一个属性,叫它就是input stream,诶你看这个or里面它就包含了一个被装饰者,谁呢?Input stream是不是有点类似于我们前面讲的对,Or里面包含一个drink呀?这个就是被装饰的对象,而我们这个better put呢,他就是一个装饰者。OK,那同学们,我们来看一下源码,给大家写下源码来追一追,大家就一目了了然了,那分析这个源码呢,我们仍然在JDK下面来写,好吧,在这写。我们写。一个源码来追一追,对correct correct OK,把主方法勾上,我们写一段简单的代码来测一下,怎么写一段代码呢?我们六一个。
03:04
Data input stream。Input the stream OK。这个是不是一个相当于是一个装饰者,对不对,那么在这里面呢,我们六一个。Five。Fair input。Stream。Input stream,好,这里面我指定一个文件。比如说我们在D盘下面呢,我写D盘下面我写一个文件叫ABC.txt假设啊。OK,那这边呢,我们会返回一个变量,比如这就叫data input stream,我写一个叫做。呃,Diss吧,简写个diss。哦,这这边没写完是吧,DS。D,好,然后呢,我们用这个DS去读取一下我们的数据,怎么读呢,我直接输出。然后Diss.read我读一个这个读的时候是按一个int读的啊,然后呢,我们Diss.close关闭,这里面报些错误是因为有些异常没有抛出,我这简单一下就说扔出去就完事了。
04:13
好代码就跑起来了,那首先我们来看看这段代码,呃,这段代码运行的结果并不重要,我们主要是来看一下源码哈,来,首先我们看。对照刚才我们讲的这个图来找一下这个关系是不是成立的,首先呢,我们来找这个从哪分析呢?从这吧,从fire input stream这一个同学们看这一个是不是就是类似于我们的一个单品咖啡。是不是啊,因为刚才我已经我已经分析了嘛,好,我们追一追它的源码来跑一下,我们往这一追,我们发现呢,诶呃,往这来看,同学们看他继承了input stream。而且我们可以看到input stream下面呢,其实它有很多的这个子类看一下。其实有没有input stream啊,就是这个input往下看。
05:05
是不是有我们刚才看到的像bit or input stream,还有刚才我们看到的。哪一个呀?我们刚才我们刚才用到的像这个file input stream是不是都是它的子类。所以说我们可以看出来input stream呢,它其实就类似于我们drink,也就说它是一个什么呢?它是一个抽象类,我们注意一下。我们可以看到,它的确是一个抽象类。里面呢,有些方法啊,方法这个我们具体我们就不去看了,有一堆像read的这些方法由它的子类。啊,有它的子类去实现,那我们再来看一下,呃,就是这个,嗯,Input stream,它下面除了有有这些子类,就是同学们看到这个。这个这个fire input STEM,还有一个fair这个词类,我们来看一下是有没有。
06:01
往下追。我还是。看一下啊,来看一下往下搂。我们找到theatre。在哪呢?好,找到了,在这。我们往下一追,我们发现呢,这个家伙他继的确继承了input,我们再来看他有哪些之类。诶,它有哪些值呢?其实就有这些子类buffer呀德呀,那这些就是装饰纸了。他充当了装饰者,来,我们看一下他的子类有哪些。好,我们找一个吧。就照我们刚才用过的data。我们找诶就到他带同学们可以看到这个data呢,继承了。Filter input stream对不对,而这个fair stream,你如果认真注注意注意观察的话,你会发现里面它这里的确有一个属性就是input,这个其实就是我们我们前面讲的什么呀,他就是一个被装饰者。
07:00
被中使者,而我们这个呢,就有点类似于我们的decorator。而这个decor下面的data这样的一些指类呢,就是具体的装饰者,就有点类似于我们前面讲的米呀so,衣呀chocolate,好,这个关系大家看是不是就很清晰了呀?就很清晰了,来我把这个地方给他简单的整理一下,呃,对这这个源码呢,我们简单的整理几句话,让大家理解的更到位一点,来走到这我梳理一下。说明。跟上我的思路,第一个我们可以看到什么呀,Input stream。Input stream,它是一个什么呢?是一个抽象类,看出来了没有,它是一个抽象类呢?它是它是一个抽象类,是不是就是类似于类似我们前面讲的什么玩意儿呢?Drink。是这个玩意吧,好,我们再来看下一个啊,同学们可以看到在我们示意图里面呢,这个东西。
08:02
OK啊,这是什么呢?它是它是我们这个input stream的词类。是它的子类吧,啊,就是类似我们前面。前面的哪个类呢?就是前面我们讲的像无因咖啡这种东西,Coffee,或者是我们讲的long black。是不是是这样子吧,同学们,也就是他是具体的我们这个单品咖啡类类似于具体单品咖啡,我们再来看三,呃,我们可以看到data,呃,我们应该先看哪个,先看这个还有一个filter。这个这个这个地方看不到啊,Filter input stream。STRSTR。Em STEM,它是什么呢?它也是input stream的子类。是他的指令吧?类似什么呢?类似我们前面。前面的哪个呀的这个decor这都能找到角色的啊,Decorator是这样子吧,这修饰者。
09:08
及修饰者。是是这个修饰,诶这个者这个者吧,修饰者,嗯,出不来修饰者,好的,那我们再来分析下面这个data input。它是什么呀?它是filter input stream的什么呀,子类。是不是就说他是具体的这个修饰者之类的,他是具体的修饰者了。修修逝者。修饰修饰。没问题吧,那类似于类似前面前面的什么的呢。诶,类似。那是前面。前面的这个就是milk呀,这样的一些修饰了milk。
10:01
还有什么呢,说等。是不是这样东西,最后我们再来看一下还有一点,大家有没有发现在我们这个filter。菲尔特这个类里面呢,这个类中。如果你刚才认真听老师讲的话呢,你会发现他这里面有一个这样的属性。是不是这样一个属性啊,它有这个东西有什么呢?有这个就相当于说我们这个装饰者里面含有一个被装饰者,即。急什么呢?含,含什么呢?含被装饰者。被装。背。装饰者。OK,是这个逻辑吧,同学们,那整个这个流程大家一看就一目了然了,所以说其他的关系呢。就分析的很到位,就这就看出来是这就是一个很标准的,从上面的分析分析我们可以看到分析得出。得出在JDK中,JDK的这个IC体系里面,体系中。
11:04
IOIO这个体系。体系中就是就是什么呢,使用了我们的。什么呀,装饰者模式,装饰者模式。对不对,再结合这个图一看就更清晰了,更清晰了,好,同学们,那关于装饰者模式在JDK应用的源码呢,老师就给大家分析到这里,我想应该大部分同学还是能能够理解的,并不是很难。好的,那这一讲我们就到这里。
我来说两句