00:00
那么在实际应用里边啊,我们装饰设计模式其实用起来比这个要复杂一些。好,下面我们再来写个例子。这个例子啊,是在原有在这个例子的基础上,我们增加一个需求,刚才我们这个需求是什么,是不是。它变成全大写对吧,现在我有新的需求了,看好。我直接拷贝了啊。零九。Decor高级的是吧,Senior高级用法。这基本用法,这高级用法啊。这个接口。这写着写着又。
01:01
嗯。写着写着,又又又忘了个包啊,加上吧,无所谓了,其实不过为了让大家看得更清楚一些啊。你这样啊,重新跑一下看看。没问题吧,好,这样更清楚一些啊。那我把这个也拷贝过来。好,我们来看啊。呃。OK了。看着。我现在啊,这个变了。
02:01
我这儿。返回这字符串啊,有前后的空格,有多余的这种空格,那我们知道这种空格应该给它删除掉对不对,现在正常跑是没问题的啊。你看全大写,只不过前后都有空格。看到没?前后都有空格。现在我的需求是。你不仅要变成大写,还应该把那些多余的空格给我去掉。就这个需求。这个好说呀。是不是这个需求好说,我把它删掉了啊。这个。我们就改成这个名了。那怎么做,我直接修改它就行了吗?你这不是two uppercas了吗?是吧,再来一个。是吧,现在在跑,看好走。
03:05
多余的空格去掉了吧。可不可以,当然可以,但是有个问题,什么问题呢?我这里边还有一个目标。累。另外一个业务接口,另外一个目标类。它里边呢,返回结果也是这样的小写有什么多余的空格,但是人家只要求。去掉前后空格,不要求变大些,那你现在这个是不是就不能用了呀。你想想是不是这个道理?你现在要用它的话。G变成大写了,又去掉前后空格了。也就是说现在的这个DEC,这个装饰者干的活比较多,既。变成大写的了又。
04:03
给它去掉前后空格了。功能不够单一,所以我们真正在应用的时候啊,是这样来用的,你看着我这个是怎么实现的。这个decorator啊,还在这样放着,我这来一个。来,Class。或者这样吧。我这个就直接改了,我这个直接改了啊,改成什么了。我这个累,换个名儿。叫什么?Rapper。包装是吧,包装啊。这是什么?这也是我们的专者。只不过这是装饰者的。鸡肋就专指的负累。
05:03
我这儿来了一个装饰者的副类鸡肋,它里边仍然是有目标对象,只不过在这儿你注意。任何增强功能都不做。装饰着鸡肋。它里边仅仅就是调用了目标类的目标方法。调用目标类的目标方法,但。不对其进行任何的增强,它就是调用它,那这个还有什么用吗?这样来看的话,他一点用都没有啊,你看着我这直接执行。你看。前后空格也没去掉,也没变成大写,是不是?
06:01
没事啊,不用担心,我们还要继续再写那个,既然是鸡类,那就肯定有它的子类class。我这个子来完成什么,我完成。我这是decorator什么意思呢?我专门就是完成去枪空格的。当然,我需要继承自我的积累。Some。需要继承子他。继承自他这这怎么了,你注意这时候就涉及到我们的基础了啊,你现在他要作为一个副类出现,对这个副类有什么要求。
07:02
要求这个父类必须要有无参构造器,否则你这个子类对象没法创建,因为子类推向在创建的时候啊,创建子类对象的时候,它会调谁会调用父类的无参构造器。你有吗?没有没有,所以这儿我给它加上无参构造器。所以我们的装饰者鸡肋。加个注意。要求。一。要有无参构造器,因为你已经是鸡肋了,肯定要做负类的,所以他一定要有无参构导器,要求二。不对目标类的目标方法进行任何增强,这就是他的两两点要求。
08:07
好,再来看它,现在不报错了吧。现在不报错了,然后干嘛?然后我们要重写。重写积累的。业务方法重写哪个业务方法do some?你看看这。这我要加竖式了,Do sum是什么?这是不是调用鸡肋机?积累的业务方法。并对其进行增强,诶这个增强在这儿呢,你这个是干嘛的trim decorator啊点。
09:15
但我这个trim decor。仅仅就只做这一个工作。Chi。那同理,我这儿是不是可以再定义一个。Class叫什么叫?Two upper case。Decor。累。Some。Surface。Do some?哎,错了。
10:02
堵堵堵堵堵。三好,那这儿写什么?点儿。To upper case OK了吧?他怎么做,看好经典的代码在这儿呢?看好啊,我的这个service。这个surface。现在调用的谁rapper是吧,你不能调用rapper了啊,不是调用rapper了,这个创建你不能用它了,你现在想想干嘛呢?想。仅仅去掉前后空格,好,我就new一个decorator。这行吗?
11:01
这样写行吗?直接利用它可以吗?你觉得行不行?肯定不行。为什么?你这个目标对象和他现在是不是没有任何关系啊,对不对,所以我们在这儿啊,是这样做的,还给他恢复了。这个rapper还是这个rapper?我这就不叫这个了,换个名。换什么名?我就叫rapper吧。我就叫rapper。紧接着一会儿加入室。I。Surface,哎,我这个叫surface。我这个叫surface。
12:02
啊,这个叫我们看一下啊。Trim。你看我这里边儿啊,少点东西了,我说呢,少什么了,这里边少什么了。我现在要写什么构造器了,你注意我这写构造器呢,我说这个写起来这么不舒服呢,这就直接应该。六六什么。Trim。DEC,然后这里边放上target,这里边放上target。
13:00
那现在没有啊,是不是没有。哎。这类没导入好。你看。我这儿添加了这样一个。那这里边儿。这里边儿。这里边儿是什么?这里边儿,哎呀。这样吧。这样最简单了,不用我们自己写了。是不是这样是最简单的?直接搞定。
14:00
什么都有了吧?是不是?哎,我现在看着这测试类。哎,我创建一个chim decorator,这是什么装饰者呀?这是具体的装饰者。我现在要增强谁,增强我的目标类,目标对象,是不是增强它了?同你这一样,我也得给他加上。OK。好了,现在你看这个service输出是什么,它仅仅就能去掉前后空格,你看是不是。是不是前后空格去掉了,但是没有变成大写。那好了,我现在。还想让它变成大写,既去掉空格又去掉呃,又变成大写,好,看好了,看好了,经典的地方在这里。
15:13
I some。我这个比如说就叫service to叫to啊。我new一个。To upper case decor,你注意我这里边放个参数了,放谁呢?你能不能像他一样放?不行啊,你要放他这这个。将来出来的这样你看一下啊,我这给你写成二,放个他级的,你看出来什么结果。前后空格没去掉,但是变成大写了。可我现在要的是既去掉前后空格,又。
16:00
变成大写,所以我现在你看着啊,我CTRLC。CTRLV,我把谁放那儿了?我把这个已经去掉前后空格的。这个增强过的service放到了。它里面作为参数了。那现在我们再运行看着走。是不是前后宫格也去掉了?这个。也变成大写了,这形成了什么,你注意这儿。将第一次增强过的。结果作为第二次增强。到。
17:01
参数出现就这样啊。形成什么东西?诶,装饰者。链形成装饰者链。它其实就是一个装饰着链把它,它把它给装饰了,他把它给装饰了,对不对,形成了装饰者亮,那么这种用法。才是我们通常的用法。那么这种用法里边有什么东西啊,我们看一下都有什么。这里边儿有一个装饰者,鸡肋。不做任何增强。这儿呢?
18:01
这叫具体。具体装饰者。要求。这个具体装者要求什么。要继承资。这个装饰者积累对吧。要求二。要有这个啊,无参构造系有没有都无所谓了。他关键的得有什么代餐构造器。要有代餐构造器。当然了,这个带餐构造器啊,你注意它,它这放的什么,放的接口啊,我们统一实现的这个接口I some surface,我们的这个链其实就是通过这个东西实现的。
19:12
同他。放的统一的是这个接口,这个业务接口。才能实现了这个量。那么还有没有什么要求了?要求要有代餐构造器啊。要求三。具体装饰者。只对。这个。装饰着鸡肋。
20:04
业务方法进行。进行某一种单一的增强。他你看。就是对它进行单一的一种增强,这样做的好处是什么?大家想一下啊,这装饰者设计模式,我们马上就能想到的是装修公司。装修公司。我们找装修公司的老板,装修公司的老板会干嘛?他把这个工程接下来。然后呢?他会调用装修公司的老板。会真正去。去做这个装修吗?装修是干嘛?装修就是对对你的功能的增强啊,你去装修房子你会吗?不会,我们普通老百姓是不会的呀。
21:04
普通老百姓不会,就可以交给会的人去干。诶,我们就把这个工作交给装修公司的,交给装修公司,那装修公司业务员也好,老板也好,他接了这个工程以后,他会具体的给你做这个装修吗?他不做。谁来做?他一看,哦,你这个啊,房子毛墙毛地。是不是毛坯墙?那需要。对墙壁进行。粉刷是吧,那他会调用刷漆功是吧,刷钳工,诶你这里边还想做个柜子。他会掉木工。需要铺地板。诶,他会找铺地板的工人,也就是说这个装修公司的老板,他是不对你的房子进行具体的装修的,也就是说不对你进行具体的功能增强,而具体的功能增强。
22:13
是由谁来完成的?是由具体的装饰者来完成的。木工。油漆工、刷墙工。对不对,他们是具体的装饰者,这个房子需要什么样的。需要做哪方面的装饰,它就调用不同的装饰。而每一个装饰者相对来说功能都是很单一的。你如果说我我这公司啊,找的这个员工。一个人所有的活儿都能干。行不行,可以。但是是不是显得有点浪费啊,是不是资源浪费。
23:01
你这里边儿只需要做的什么,需要哪一种装修功能,我就调哪一个装修师傅过来。这就OK了,这是最简单的。你说我这既需要刷墙又需要。啊,又需要铺地板,又需要做木工,木木工,那好,我就得找这样一个人,这三样工作都会的。好找吗?不好找。假设说你找到了,好了,我这边又有个工程了,这个工程需要做四类的装修。啊,铺地板,弄墙,做木工。还得水电的,那我还得找一个装修师傅是吧?这四样工作都会做的,这不好做呀。这样的人不好找啊。但是会某一样具体装修工作的人很多,我需要哪种功能?我的调那种。
24:03
这就是这种。我们真正使用的装饰者设计模式,真正用的时候是这样用的啊,用法真正用起来比我们前面说的这种简单的装饰者设计模式理解起来这个好理解啊,这个好理解,但真正用我们不这样用,是这种更为复杂的用法,OK了,这就是装饰者设计模式。
我来说两句