00:01
用装饰者设计模式,我们来解决一下前面讲的星巴克订单问题,那首先我们可以看到这张图哈。首先呢,我会做一个抽象的类drink,在这个抽象类里面呢,我们会有对这个饮料的一个描述,同时最关键的地方呢,会有一个cost方法。这个cos的方法呢,我们会让下面的子类去进行这样一个实现,同学们看,在前面我们讲的讲的那个图里面呢,这个抽象类其实就是component,我们是让单品咖啡直接继承的,但是因为我们这个单品咖啡的种类比较多,对吧,所以说我这里呢,在做了一个缓冲层叫coffee。也就是说我在这一个具体的纸类单品咖啡和我们这个drink这个抽象类之间呢,我做了一个缓冲层叫coffee。把这些单品咖啡的共同点抽取到这个coffee这个类里面来,也就说这块同学们看到这块就是我们所说的被修饰者。
01:06
被修饰者,那同学们,我们看到这有个decor,就是我们的装饰者,那大家知道装饰者呢有很多,我们有chocolate这种调料,我们也有milk这种调料,我们还有so,因此呢,我们在这个地方,这个呢,我们把它。这个进行一个。进行一个抽象,对进行一个抽象,然后我们让下面具体的这一个各个调料去继承这个DEC,还有一点,大家有没有发现我们这个drink。这个drink和。这个装饰者就是这个这个装饰者这个类,他们之间是继承加组合的关系。那也就是说我们这个do呢,从这个。类的关系来说,它也是drink的一个子类,同时它也组合了一个drink。
02:00
那这样就意味着我们下面的这个各个单品咖啡,呃不各个这个调料,他们他们这个纸类里面也有这个drink对吧,你拿一份。单品咖啡,至于就相当于说我们有了一个,呃,有了一有了一个这个这个drink过后呢,我们把它进行单品,就是这个调料的一个装饰就可以了,这是这么一种图形,大家可以看到这种装饰这模式的设计的好处在什么地方。它的好处是在于,如果我们再加一个新的单品咖啡,我们只需要他去继承我们这个coffee。然后这下面的这个调料不需要做任何变化,就马上就可以去计算这种单品咖咖啡加不同调料的组合得到的这一个成本或者叫费用。说这种方式大家可以感觉到它是非常不错的啊,那现在呢,我把这个图做一个简短的说明,我们来理解一下,那首先我们看drink CLA。
03:06
Drink类呢,是这个drink类就是前面讲的。前面说的。说的这个抽象类。OK,其实就是我们所说的component。Component。Component OK。Comp。OK,好,我们再来看这个你们看到的short black。这个是什么呢?就是我们的单品咖啡。单品咖啡这个也没问题是吧,这个和前面的含义也是一样的,我们再来看。Decorator。这个是干什么呢?它是一个装饰类。它是一个装饰类,注意它含有,它含有什么呢?含有一个被装饰的对象。
04:00
哪一个呢?就是同学们可以看到这里面写的drink object,也就是说我们这个drink,呃,这边当然到时间肯定是个具体的一个单品咖啡了,它被我们这个or修饰,它被我们这个修饰好,我们可以看到这里面还有一个比较关键的地方就是cost,同学们可以看到decor。对呢,他这他的这个cos的方法。方法它是干什么呀,他是进行了一个费用的叠加。叠加的计算计算,因此呢,这个地方它会使用到递归,它会递归的计算出价格。所以这里面这个cos的方法是,其实这里面有递归的概念,待会呢从代码里面也可以看到。啊,这个这个流程好,嗯,那这样子的话,有了这样一个设计模式的方案图,我们待会写代码呢,就比较方便,我们再来看一个具体的这个下订单的一个情况,比如说再前面这个设计模式的基础上,如果我们点了两份巧克力,再加一一份牛奶的non block,就是美式美式咖啡。
05:11
比如说我点,我点了一点了一份non black这个单品咖啡,再点了在这个基础上我加了两个两份,嗯,加了以下的调味品,一个是两份咖啡,呃,两份巧克力,再加一份牛奶,那么这个示意图是什么的呢?首先你要先点一份单品咖啡,然后把这个单品咖啡包裹到这个面这个director里面去。这样子,这样就是一份,如果我现在圈到这个小圆圈,就是一份单品咖啡加一份milk。但是呢,有了一份蜜尔,蜜尔口供呢,人家说还有两份巧克力,那怎么办呢?再让巧克力这一个装饰者再把这个包裹起来,这样就形成了什么呢?一个单品咖啡non block加了一份巧克力。
06:02
再加一份米尔克,但是我们还有一份巧克力,这又怎么办呢?又再包裹一次。诶,它是这样一种流程啊,所以大家理解一下,那么我这里有个说明,再来看一下同学们看,首先看这个地方是M包含了一个number,也就是说我们是让装饰者去包含这个被装饰的对象,那么到了这一层呢,是一份chocolate 1chocolate,又把这个milk加bla看成一个被装饰者。因为它是递归的嘛,所以说相当于说米加long black呢,又看成一个被被装饰者了,然后用谁来装饰,用chocolate这个装饰者来装饰这个被装饰者。那这样子第二份就形成这个这个流程。OK,那么再来看一份巧克力,又包含了这样一个被装饰者,那就形成了最外面这一层,于是这样子我们就是进行这个装饰着的一种方式,不停的叠加,就完成我们这一个案例了。注意听这句话啊,这样不管是什么形式的单品,咖啡加调料组合,通过递归的方式,为什么递归?因为我这个地方是包裹再包裹,是不是我是一个包裹的包裹的一个叠加,或者叫递归,因此呢,通过递归方式,我们就可以方便的维护这个组合。
07:24
OK,好,那现在有了这样一个基本思想过后呢,下面不啰嗦,我们写代码了,这个代码稍微有点麻烦,这个代码的类很多。代码类很多,他们的关系呢,就是根据前面这个关系来走就行了,好吧,嗯,代码类很多,但是本身实现起来并不是特别的麻烦,OK,那现在老师就根据这个思路一步一步的编写,打开我们的eclipse OK啊。那现在呢,我们新建一个包包,新建一个包包,跟上我的思路点一下,新建一个package。那这边呢,我们写的是装饰总模式decorate,没问题吧。
08:04
好的。好的,那首先我们先建这个drink,是不是drink好drink我们分析到它是一个抽象类,没问题吧,把objects勾上。注意写代码啊,代码是我们来理解这一个模式的关键,所以说代码支撑很重要,代码的支撑很重要,我们前面讲了那么多,没有代码不行的public来走一个public string,首先呢,我们有一个描述,是不是对我们这个对我们这个drink的描述。写到这描述没有问题吧,现在呢,再写一个private,那么我们价格呢,比如是私有的price price默认我们给他一个00.0F。0.0F没问题啊好,这是它的两个属性,下面呢,我们给他一系列的set和get方法就可以了。OK啊,来,Set get都给他。
09:03
曼尼,是不是?嗯,有了set和get方法过后,我们是不是还需要一个最核心的方法,就是那个计算。计算这个价格的或者费用的费用的一个抽象方法。是不?在前面我们讲过,这个方法是蛮重要的,OK,那就是public。Public abstract没问题啊,然后呢,Float返回一个float,然后呢cost完事,注意这个方法呢,会被它的子类子类来实现。明白,因为你不同的价格,那我哪知道你哪个单品咖啡,哪个调料是什么价格呀,所以说我在这做了一个抽象方法,便于我们待会的调用好了,那这个写完了过后,下面我们是不是应该写这个coffee了,把coffee这个类也写出来,Coffee这个类呢?我们是把各个单品咖啡的共同特点抽取到或者提取到这个coffee。OK,那现在呢,我们再写一个。
10:01
哦,OK,那我先写,那怎么写啊,我们就,呃,就写到这吧,同学们,那我就写到这。那么,Coffee coffee coffee。那这个coffee呢,他要去继承,刚才可以看到了,他要继承我们这个drink,是不是他要继承这个drink,那他这里面有个什么方法呢?OK,这里面呢,他要去重写,因为它继承drink,它就要重写这个方法,那这个方法我们这直接就简单先简单写一下,就super.get price。对不对,因为你你这个成本在计算成本的时候,如果针对一个单品咖啡而言,其实就是它的价格。是不是这样子,就是它的价格,它的价格是什么?一份单品咖啡就是多少钱,好,这个就写完了,紧接着我写下面的单品咖啡,一共有几个,四个啊,写写,那我们先写第一个,就是按顺序来写就行了啊,Is price。啊,你看是不是啊,意大利咖啡is。
11:02
P e espresso espresso。是这样子写的吧,Espresso is pressure OK,那呢,接着往下写,他要去继承什么呢?他去继承。对,他去继承,诶往这写,他去继承我们的这个coffee。进人扣费。那大家想一想啊,同学们,你这个意大利咖啡的价格是不是要通过你构造,你再点这个。单品咖啡的时候就应该有,所以说我们这有一个构造器。诶,这地方怎么没有了,写上这啊,Public。Public espresso。嗨么?呃,在创建这一个PE的时候,我们就把价格给他set。Set什么呢?Set它的一个描述我们写上,这叫什么呢?叫做意大利咖啡,意叫意大利咖啡。
12:02
没问题吧,意大利咖啡。别写错了,然后把价格是不是也给他呀,Set什么呀,Set他的一个price,它价格,它价格我们认为一份单品的意大利咖啡是六块钱。那你啊,这就给他了。同样道理,其他几个呢,依法按照这个顺序来写就可以了,来走一个。走,下面呢,我们再写各类。这几个类,我们取个名字叫呃,No black。美式咖啡。美式咖啡nub,同样我们也让他去继承。那去继承哪一个呢?Coffee没问题吧,同学们,那现在呢,我们也把它的构造器来写一下public。Non black。好,这里面我们也来设置一下它相关的信息,比如set它的一个描述,这边我们就简写了啊,不写那么多了,Long black。写完,然后呢,把价格给他设置一下,比如说我们认为no black的价格呢是五块钱。
13:07
五块钱啊,假设这样写的,来,我们继续编写,下一个呢,我们再写一个类,OK,这个类我们叫做。Short black。啊,Short black b,好的,把它勾上哈,勾上。那同样我们也来继承哪一个呢?继承我们的coffee。继承我们的coffee没问题,那么同样我们写一个构造器public。Short black。把他的两个方法也处理一下site,它的描述简写一下short black。然后呢,把价格给他设一下,价格设置一下,然后这个价格呢,是4.0F,好同学们,另外的还有一个咖啡我们就不去做了,还有一个叫无英咖啡,我就暂时不写了,因为大同小异,大同小异OK,好,现在呢,我们已经完成了哪哪块这边这边这边现在我们应该写的一个d direct,呃,Decorator,我们把decorator写出来,它是装饰者。
14:13
装饰者,来,我们写一个装饰者。在这写哈,走一个。Orator。跟上我的思路没问题吧,Decator。好,写上,首先这一个呢,它也要去继承我们的drink,是不是这个道理,从我们那个图书上可以看出来。看出来的drink。Drink它也是一种饮料,然后这时候呢,我们要去实现它的相关的方法,来走一个,其中有一个方法是什么呀,Cost必须实现,那cost怎么去计算它的成本呢?那就应该这样写的啊,同学们看super.get price拿到。它的一个价格就是这个drink的价格,Drink drink这个价格拿到过,再加上。
15:03
哦,就是他自己这个这个这个get price是他自己的价格,同学们我再说一下这里面这个get price先拿到自己的价格。是自己这个调料,就是这个他自己的价格。价格。OK,但是大家知道我们从这个示意图可以看到decorator里面会去组合一个饮料,就是单品咖啡,所以说这个我们要写进去,是不是这个道理啊,Private drink.ak object是不是?那这个时候你除了自己的价格要统计进去,是不是还要把。你这个单品咖啡组合,单品咖啡的价格也要组进去,那就cost了,因为你这个单品咖啡里面也有cost方法,我把它组合起来,就是自己的价格加上你的这一个drink的价格。完事啊,所以说这地方大家可以看到他会他会这样去叠加处理好,这样写完了过后,我们是不是还要去重写。
16:02
啊,我们再去把它的构造器写一下,把构造器写一下public DEC。构造器写一下,那这个构造器呃,得得考,这不是写多写了一份对吧?Cor,那这个构造器咱们怎么去玩呢?其实就是把这个drink给它放进去就可以了。是吧,我们这drink。OOK给到他,因为这个就体现出组合了嘛,这个就体现出一种组合的关系。对吧,就说我在建一个decor的时候,我想计算价格,我把自己的一个drink放进去,然后一统计价格,新的价格就出来了。新的价格又出来了,我们还有一个什么描述,我们把这个描述也写下,Get。这个要给他重写,嗯,描述呢,我们要返回你当前这一个。装饰者。在自己的这个,呃,装饰情况下,本身这个drink里面的一些情况,所以说我应该是这么写的,怎么写呢。
17:06
首先我把自己的一个描述拿到,就是super。Super点。它上面这个描述再加我们打一个空格。再加什么呢?再加上它的价格,就是你现在这个价格,我要拿到super.get price。是不是把价格拿到,然后再拼上。而在拼接它的另外一个信,信息什么呢?OBB j.get它的描述大家看这是这是在做什么事情呢?打一个分号,这个地方就是说我首先把我自己的这个副类的这个D,呃,DS的情况打出来,描述拿出来,然后我拿到价格,就是他负类的一个价格,Drink的一个价格,这个价格完了过后呢,我再得到自己的描述,呃呃,不再得到我这一个被装饰的描述信息。
18:03
看到没有,这个是被装饰者的描述信息,写到这里来。奥杰是我的贝是我装,是我这面组合的一个drink嘛,所以他其实这边是输出了,输出了被装饰者。被装饰者的一个信息。对吧,OK,这个应该是比较好理解对吧,我把我的信息打出来,然后价格打出来就可以了,实际上呢,你这个super不要也是一样的。实际上你不要也是一样的,看到没有,这不要也是一样的,因为因为你这个你不要不点super默认也是从drink里面拿到它的信息,然后在drink里面找到它的价格啊,就是他附类,他附类这个drink,他继承的这个drink的一些信息,再加上我被装饰者的这个信息就完事了。好吧,同学们应该大体能理解,就输出信息。好,那这样写完了过后,是不是下面我们就应该写它下面具体的各个什么呀,它下面具体的各个。
19:06
呃,这个调调味品的信息,比如说chocolate milk和so,我们来写一下。好,我们来先写一个,先写一个chocolate,跟上我的思路。跟上我的思路来走。新建一个类。新建一个类,这个类呢,我们叫chocolate,求。是这样写的吧,Chocolate。那chocolate呢,它其实是要继承。继承哪个呀,根据刚才我们画的信息,他要继承我们的这个decor。Decor,这个就是一个具体的具体的一份单,这个调味品了。是具体的这个decor。是不是?OK,在这里呢,就是调皮。这里。这里就是条。Wait。
20:00
调味品。调味的。调。调味品。OK。好的,那现在呢,我们来把这个相关的方法处理一下。我们首先需要加一个构造器drink进来,那super这个我们不用不用去管它,那怎么去处理呢?首先我们set它的一个信息。晒,怎么样?Description,我写上这个调味品是chocolate cho。克利。是不是巧克力,然后呢,我们还要把这一个chocolate的价格是输进去,是不是我巧克力的价格写上这里,Price。Price a,那就这样子,我们认为一份巧克力的价格呢是3.3块钱。这个我写一下这是什么呀,同学们注意听,这是什么呢?这是这是这个调味品的价格。
21:00
就是当前这个调味品的价格。大家看看是这样理解的吧。诶,就调调味品的价格,那同样道理,下面几个呢,以此类推,以此类推,我们写一下就行了,来走一个。首先呢,我我们再写个M。Milk。对,米也去继承这个orator。对吧?Decor跟上我的思路啊,同学们同样也把它的构造器写一下。好,同样我们写上它的一个描述,这是什么呢?这个调味品是牛奶。牛牛奶啊。牛奶。牛奶调味品价格,我们也设置一下那一个milk的价格呢,我们假定比较便宜啊,两块钱一份,两块钱一份2.0F。这个是牛奶,这个调味品的价格,看清楚了,我们还差一个什么呀,豆浆来加一个豆浆。
22:02
所以。So okay。豆浆呢,它也是一种装饰者,所以说他也要去继承,他也要去继承我,他要去继承director。跟前面一样,把构造器写一下,那同样我们在这写上它的一个描述信息,这是什么呢?豆浆。豆浆。豆浆OK,豆浆的价格呢,我们也来设置一下,比如说咱们一份豆浆定多少钱呢?一块五吧。对,就定一块五便宜1.1.5F。好,同学们,那现在呢,我们到此哈,注意观察,现在我们把那些都写完了把。这都好像都写完了。是不是都写完了,都写完是不是我们就可以来使用一下了,下面呢,我们写一个咖啡店来使用一下我们这个代码,我们就以这个为例。我们用刚才写的这个方式来点一份non black。
23:02
然后呢,我们加入两份巧克力和一份牛奶,再分别统计他们价格。OK,那同学们,我们写一个。客户端。客户端,好,这个客户端我们取个名字叫coffee。Cofe coffee bar。OK,把主方法勾上来,跟着我的思路啊,同学们。那现在我们要完成的目标是来。用装饰者模式下个订单。那你看我怎么用好,大家都知道装饰者是什么呀,是先有这个non black,然后把它放在装饰里面去,所以说你第一步应该干什么呢?我们先要点一份这个number black先点一份。Long black,没问题吧?那这个很简单,我们溜一下就行了。六、long black。这是一份,我深思一下。
24:00
叫long black,但是你在点这个long black的时候呢,同学们,我们这个地方就最好不要用long black接收,我们用drink来接收。这相当于这是我们,因为你还没点完嘛,认为我这是一个order,大家明白我我的我的什么意思吗?因为大家知道,从我们刚才看的这个示意图来说,单品咖啡。其实就是一个drink,因为drink是我们的超类,或者说是我们鸡肋,所以我认为这是个订单,我还没点完呢,对吧,如果我在这马上去统计它的价格,其实也是统计出来的啊,比如说我们现在,呃,现在什么呢?这个费用费用一,我们先输出现在的费用是什么,这个时候因为因为你没有去装饰它,所以说此时此刻同学们。此时此刻你去统计这个订单的价格呢,就是单品的价格,我们执行一下。来,我们执行一下。诶,我们。执行了没有,执行一下,同学们看到这因为是个单品咖啡,所以说费用就是。5.0,但是我把描述信息也打印一下,好吧,把这个我们第一个订单订单的这个描述。
25:07
描述信息,描述信息我们可以看到这个订单具体的一个情况,他到底点了什么,是不是有一个get。是不是这样子就可以了,来走一个。我们看我们第一个情况,实际上就是点了一份non black。五块钱。没问题吧,好,现在假如我们我们我们认为这个订单第一份订单还不够,我们紧接着呢,加我们加入加入什么呢?加入一份牛奶。加入一份牛奶。OK啊,那他做一份牛奶怎么加进去呢?同学们,他应该是这样加的啊,New milk。New,然后大家看到没有,把我们这个drink放进去就可以了,你drink是哪一个呀?是不是就是order?是不是就是order,所以说这个地方拿到以后呢,这个order就变化了。看到没有,它是这样子的。就相当于说,我们把第一份order放在这个装饰者里面,让这个面去装饰我们,或者要包裹我们就可以了。
26:07
那你这样一加就相当于给谁呢?给我们第一份订单,给这个order加入了一份牛奶,那这个时候我们再来看此时此刻的情况又怎么样?好,我们。我们这样子啊,加入了一份牛奶过后情况是怎样子的?加入一份牛奶过后的费用等于这个好的order加入了一份牛奶过后的描述信息是这样子,我们看一下能否马上得到一个变化来,各位朋友执行词OK啊,大家看order加入一份牛奶过费用变成七块七块钱了。那么为什么加了七块钱呢?因为你order加了一份牛奶,是牛奶是两块钱,再加一个non black non black,它实际上是五块钱,所以加起来是七块钱没问题吧,但是我们还没完成,来,接着走。现在我们再给这个order,在原先这个基础上再加入,加入什么呢?再加入一份这个巧克力,巧克力。
27:03
好,那我相信大部分同学知道我要怎么做了吧。哎,大体应该明白了,所以说他就这样子的了,把order放进去,但是这是chocolate,所以你这chocolate就行了。用巧克力来包裹一下我们这个订,包裹一下我们这个订单,好,这个时候order加入一份巧克力过后,那么应该这样写,加入一份牛奶。又加入一份巧克力。是这样子吧,虽然有点麻烦,但是我们看清楚,这样子可以order加入一份牛奶,再加一份巧克力,过后这个费用的情况又发生了变化,来走一个。好,同学们可以看到在下面。加入一份牛奶,加入一份巧克力,费用变十块钱了。为什么是十块钱加了三块钱呢?因为巧克力是三块钱一份。所以你看你这个这个订单的情况是巧克力三块,牛奶两块,Non black是五块,加起来十块。是不是好同学们,现在我们还要加吗?还要加,因为你还远,还还差一份巧克力呢。
28:02
是不是还差一份巧克力?OK,拆下一份巧克力,我们把它加进去就完事了,就就这样,这样再执行一遍就可以了。这就相当于说又加入一份巧克力,那就加入两份巧克力。是这样是吧,加入两份巧克力,好,我们再来执行值。同学们可以看到OK啊。嗯,大家看order加入一份牛奶,加入两份巧克力,变成十块13块,然后呢,它的描述是这样子的,巧克力一份,再来一份巧克力,再来一份牛奶,再来一份nu black,就这样子就得到一个求解,哎,同学们有没有发现这种这种情况是特别好的一种方式啊。周老师为为什么好呢?大家有没有发现,你看啊,我这里故意留了一个,呃呃,D Co d我没有加进去,大家想,如果我要加一个单品咖啡,无因咖啡。诶,你们有没有发现,我只要在这个地方继承一下coffee,其实这个无因咖啡,他就可以去跟各个这个调料发生一个关联了。
29:08
是不是这样的,同学们你们可以可以考,考虑到这种扩展性是非常优秀的,我们原先我们原先加一个咖啡啊,同学们,我们原先加一个单品咖啡,我们变化很大。如果按照第一种第一种方案,那个组合就很多了。按照第二个方案呢,你加一个无因咖啡那个类,它那个调用的类也要发生很多变化,现在变得简单了。是不是变得简单了,我们只需要加一个无因咖啡,然后让他去继承这个coffee,那这个无因咖啡单点也可以点跟下面任何一个这个调料进行组合,组合多少都无所谓,所以说这种方式还是非常优秀的,大家能感受到这种设计装饰的设计模式的好处吗?诶,如果你感受到了,说明你确实能够理解了,对吧?如果你没感受到,你可以这样子,你可以在这说,诶老师我加一个。我加一个无音d Co d。
30:04
对不对,我们让这个迪卡呢,跟前面这个一样,我我就不写了,我就拿过来像这样子改一下就行了,这是我们的无因咖啡。对不对?同学们看我加一个无英咖啡进去。改一下就可以了,然后让这个无因咖啡去继承我们的什么呀。啊,不是,就是顺我们的coffee,因为中间我做了一个缓冲层,那这边就变成了无因咖啡。无因这个这个无无因因这个因无因咖啡,假设无因咖啡它是比较便宜的,一块钱一份。一块钱,诶你看这我就加了这一一样东西喽。我加了这一样东西,你们你们会神奇的发现什么呢?诶,你看我在点的时候,我我的在哪去了。在这你看我现在点点无因咖啡马上也可以统计了,你看就就任何不需要变化的,对吧,我们来无因咖啡。点这做一个测试啊,感受一下它的一种一种一种设计模式给我们带来的好处,优越性好的,那现在我要点一个无银咖啡第一卡。
31:11
好的,你看无银咖啡,我们认为它也是drink嘛。说假如这是我们的第二个订单,假如这是我们的第二个订单啊,同学们无银咖啡就来了,那现在呢,我们就可以输出我。写一下。同学们看我在写order order2 order2。是干什么呢?无因咖啡无无因。五五。因咖啡。咖啡它的费用,那么ORDER2这个无因咖啡的描述我们也能拿到,看我给大家执行一下。那无印咖啡只有一块钱,那肯定就是一块钱了。你看这。诶,五银咖啡在哪去了?啊,这个地方是有问题的啊,我我这没有掉对,应该是调order几啊ORDER2才对,是不是啊同学们你们调错了,那肯定就不对,同学们看到。
32:05
我们在调这个时候是无因咖啡的费用是一块钱,现在描述就是一个无因咖啡是不是好,现在无因咖啡假如我们要加一点,加一份牛奶是不是很方便的呀?我我现在不需要做任何变化,我只需要在原先这个基础上改动一点点就可以了,哪里呢,我让比如说我要我要在这个无音这个无因咖啡上呢,我加一份牛奶。M。看到没有,我把这一个ORDER2放进去,ORDER2放进去,然后呢,这个是相当于加入了一份牛奶。OK啊,加入牛奶,加入一份牛奶,你看它马上就发生变化了。能不能这样用呢?来跑一个。诶,这么有问题,代码有点小问题在哪里有问题,这少了一个分号。来再运行之。看一下效果,你看呃,无因无因咖啡加了份牛奶,变成三块钱了。对不对,无因咖啡他加了一份牛奶,是因为牛奶是两块钱,无因咖啡一块钱三块钱正确,好同学们,那关于这一个我们所说的什么呀,就是用装饰这种模式来。
33:11
来解决我们星巴克咖啡订单的问题,可以看到非常的方便,OK,那关于装饰者模式的一个应用实例,我们就讲到这里。
我来说两句