00:00
既然第一个方案不行,那么我们来看第二个解决方案可不可以?那么我们提出第二种解决方案,前面分析到方案一是因为咖啡单品加调料组合会造成类的倍增,也就是说它的问题是在于你在进行设计的时候,你你这个单品会跟这个调料组合。形成了很多类,那因此我们可以怎么样呢?做一个改进,我们可以将这个调料内置到drink类中,这样就不会造成类的数量过多了。嘿,你看这个方案还是OK的,对不对?你看我在这里做了这样一件事情,Drink这个类呢?仍然是一个抽象的,做成一个抽象的,只是在这里边除了有一个描述之外呢,我还加了另外三个属性,分别是。它的三种调料,Milk soy和chocolate,诶,同学们。这样子,因为我把这三种调料。内置到我们drink里面去了,那同学们想我在用各种单品咖啡。
01:03
去继承我们这个drink,那就意味着我们单品咖啡,每一种单品咖啡里面就拥有了所有的这个调料,是不是?那问题来了,有些同学就说了,老师,那假如有些单品咖啡里面他不需要这个调味品怎么办呢?你看我这做了这样一些方法。诶,我是想到这个问题了。那首先呢,我要判断你在点的时候,你有没有要这个milk。如果你,如果你需要这个milk,那我就晒一份。对不对,如果你有这个在统计的时候,当然我也可以set,我先set进去,如果你在点的时候,你点了一份豆浆,我set set1份进去,然后呢,我在做统计的时候。我在做做这个统计的时候,我可以看你有没有这个效益。或者说通过返回你点了几份这个调料,来统计调料这方面的价格,进行一个总和,是不是,也就是说我这里面会有相应的方法来判断你点没有点,有没有点这个调料,并且呢,能够判断你点了几份。
02:12
这样子呢,我们把这些东西整合到我们costs里面去就可以了,诶通过这样一个改进,大家可以看,可以感觉到我们这一个类数量过多的问题其实是得到了解决。其实是得到了解决,只不过我们方法增加了而已。帮方法增加了,增加了相应的方法而已,所以说还有一一点milk soy chocolate的可以设计成booing表示是否你有没有点。那么我们还有一个要给大家讲的。如果这里。这里还涉及到就是在点这个单品咖啡。加这个调料的时候,这个调料它也可以选多份,那么你在这地方返回的时候呢,就比比如汉milk,你返回的可能不是BOO,而是返回一个int类型就可以,比如说我返回的是零,就代表。
03:08
没有点我返回一,代表你点了一份milk,如果我返回二,就代表你是点了一个单品咖啡,再加了两份蜜尔这样的调料就完事了。是不是还是可以的,但是这种方案是不是就很好呢?还是不行?我们还要来分析第二种方案存在的问题。来,各位朋友,我们一起来看看第二种方案的这个问题之所在。方案二。方案。对。方方案二,方案二呢,可以控制控制什么呀类。类的数量。而不至于什么呢,不至于这个造成造成过多的。造成很多很多的累,这样就不会有累爆炸了,不会有这个类爆炸的问题了。第二点呢,我们还想到啊,在。
04:10
在这个增删增加我们叫增加或者或者删除,删除这个调料种类时。调料。调料种类。这个种类是啊,我们可以怎么办呢?代码的维护量,代码的就是代码的维维护量还是很大。它的维护量还是很大,那为什么呢?你想一想,我们在这边进行这个控制的时候,你你这地方每一个都要去判断,你想想你是不是每个都要去判断他有没有,他有没有这个密尔有几份,然后还要去写代码,是不是代码维护量还是很大,比如说我再加一,我再加一份。这个调料或者再加一份单品咖啡,你这个改动还是很大的,所以说我们这分析出来代码的维护量很很大,还有一个呢,大家可以看可以看到啊,我们如果说考虑。
05:08
考虑到。考虑什么呢?这个用户用户可以点,可以点什么呢?可以。可以可以添加,添加多份,多份这个调味品的时候调味。叫做调料。调料时,呃,可以将这个。这个汉。汉就是汉什么什么什么这个这个方法,呃,返回什么呢?返回一个对应的特性就可以了,所以说这个方案,这个方案其实比第一个方案要好一些,但是它的问题就是当我们增加或者删除这个调味品种类的时候呢,代码量还是很大,因此这个方案呢。我们认为也不是完美的,于是我们就推出什么呢?现在我们就可以考虑对吧,我们考虑使用什么呢?使用装饰者模式。
06:07
装饰者模式OK,那现在呢,我们就要准备来讲一下装饰者模式到底式什么样子的,那就是我们的下一个方案。就是装饰者是怎么去设计我们这个星巴克咖啡订单的问题,好,那关于装饰者怎么去解决问题,我们放到下一个视频为大讲解。
我来说两句