00:00
在学习过了filter的基础知识以后,下面我们就来看filter的应用举例。呃,我们在讲这个例子的时候啊,需要用到一种设计模式,装饰者设计模式,所以呢,我们先把这种装饰者设计模式说一下。装饰者设计模式。Patent。他干嘛呢,能够在不修改目标类,也不使用继承的情况下。动态的扩展一个类的功能。它可以动态的扩展一个类的功能,也就增强对一个类进行增强。那么这个在使用的时候需要注意两点,第一,我们的装饰者类要和目标类,就是我们要增强那个类成为目标类啊,实现相同的接口,或者继承自相同的抽象类。
01:10
第二,在装饰人类里边要有目标类的引用。干嘛呢?你要在装饰类里边调用目标类的目标方法。所谓目标方法就是。我们要增强的那个方法。OK,满足这样的两点就可以了。那么我们首先来写一个简单的装饰者设计模式。代码啊。呃,我们在这儿要创建一个。Java project。零八。
02:02
装饰者设计模式DEC。呃,咱们。Base基本的啊,装饰者设计模式。Decorator啊,Decorator。没写错啊,Decor好。呃,切换视图。好,我们切换成了Java视图了。哎。我们首先来定一个接口。比如叫I some surface。Come,点北京。Power node点这样我这个叫。
03:05
那么这个接口。其实就是我们的业务逻辑接口。叫主业务接口。那我们的业务逻辑做在。都是通过它实现的啊,这里边儿我们有一个方法。嗯,有一个方法,咱们这样返回。呃,这个方法返回字符串,我们叫什么?就叫do some吧。就叫杜萨。嗯,就叫do some,咱们这样吧,这里边儿也给了个字符串吧。其实给不给吧,无所谓,咱们为了简单啊,就不给了,就不给了啊。
04:02
这个无所谓,好。这是我们的业务接口有了,那正常情况下来写的话,我要写这个接口的实现类。Class。Class。Some service实现的接口I service。好。这儿我就来一个啊。Abcd返回abcd,我刚才想写个参数啊,就是让用户输入,后来想了想,真的吧,不写了。为了简单啊,我这就返回abcd。你好。这service有了,再来一个测试类吧。
05:02
词类。叫my test。包含上主方法。当然我们写一下啊,加个注释这是什么,这是我们的目标类啊,这目标类里面这个方法。实际上确切的说,这个方法接口里边这个方法称为目标方法,将来我们要增强这个方法呢。当然这个也是我们的目标方法,对吧,目标。先不说增强的事儿。现在。现在我们就调这个目标类的目标方法,那就是I,我另一个some。
06:01
Surface,不过不好啊,不好到哪呢?我们一般这个接口的实现类啊,呃,要以音结尾,我们给它改过来吧。还正常写,咱们不要那么简略啊,Input some surface imp,好,surface.do some。它有个返回值,Result。我现在输出。OK,就这写完了,现在运行。难题吧,Result等于。是不是abcde,这没问题的啊。
07:01
呀,这又忘了来个package啊。Package。这个我们叫test,把这个测试类给它弄过来啊。分个包。好。运行没问题啊,OK。现在啊,我有新的需求了。什么需求?出出的这个abcde啊。你要给我变成全大写的。给我变成全大些。那好说呀,是不是我直接给这儿。点two upper kiss。全大写吧,可是你注意,我有要求。要求是直接你获取到这个result就是全大写的,这不用再加这个to up case了,也就是说这个do some方法的返回值直接就是全大写的。
08:12
啊,那也好说。那我就直接炸,给他点to upper kiss。签大学吧。你注意还有要求,你事儿真多,是不是什么要求呢?你不能修改目标类,你注意是不能修改目标类的。哦,又不能修改目标类,你还得在调用这个do sum方法的时候返回的是什么全大写。那这能实现了吗?这时候。我们就得考虑这个问题了。现在的这种。
09:01
需求,或者说这种语言环境。要实现什么目的?要实现在不修改目标类的前提下。对目标方法进行增强,功能上的增强,增强什么?把这个结果由小写变成大写。那么这个就符合谁的应用场景啊。装饰者设计模式的应用场景。所以下面我们就定义一个。装饰着,那好了。来一个。这个class我们叫什么?叫service,装饰者Di?
10:09
实现。你注意这个装饰者要实现和目标类相同的接口。I。OK。这是我们的装饰者。这是装饰者。好啦。这是第一个要求啊,你注意我们。刚才在说的时候啊,这个装饰者要求。实现和目标。目标类相同的接口,其实确切的说啊,因为我们的目标类啊,有可能人家还是实现其他的接口,你现在想增强谁呢。
11:02
你现在想增强谁呢?你就实现哪个接口。不过我们一般。就说了。这是装饰着啊,要求。装饰着。要实现与目标类相同的接口。这是要求什么?一还有要求二。要求二是什么?你要想增强目标类的目标方法,那么你就得在这儿,在这个装饰者类里边调用。目标类的目标方法,你要想调用它,你就得拥有。这里边儿得有。目标对象啊,所以我们在这儿要private I some。
12:11
我这个叫什么叫target。这是我的目标。对象是吧,这目标对象,这个目标对象怎么来的,我们一般都是通过。代餐构造器传进来的。通过。代餐构造器。啊,传入目标对象。
13:01
那这样的话,我们来看,现在我就可以来做了,他这点do some点。什么upper OK了。这个OK了。那OK,以后呢?这个以后我们就可以直接在这儿,这样啊,我我给大家把这段代码留下来,我再写一个test。要最原始的呀,是吧,最原始的我们留下来。在这儿。我就不创建,或者说我这个就不是some service了,不是这个。目标类谬出来的了,是谁呀,Some?Decorate。耶,这儿需要传一个目标对象,有吗?没有,没有创建一个你一个surface OK了吧。
14:18
这是什么?创建目标对象,这是呢?使用目标对象。作为参数创建。创建这个装饰者。那在这使用的谁?这使用的就是装饰者了啊,使用装饰者。到。业务方法就do some嘛,我们这个业务方法。
15:03
OK,现在你再看一下。输出结果是什么?走。是不是全大写的,你看看是不是满足D,我获取到的这个结果,这个方法的返回结果直接就是大写的,并且还没有修改目标类。这就是个增加了一个类。对不对,它增加了一个类,这满足什么。这满足我们说的啊,到搞开发的时候有个开闭原则呀,就是你原有的代码不要修改,你可以开是对什么开,对功能扩展的开,就你可以增加类。B对什么B对?原有类的修改是B的,就是你不能修改已有的类,你可以增加新的类。
16:01
就满足开辟原则。哎,我们重新再说装饰者啊装饰者。要求一、装饰者要与目标类实现相同的接口。第二呢?装饰者类中要有有什么?要有目标对象。作为。成员变量。切目标对象。是由。代餐构造器传入的,那有哥们说了,那那我不通过它传入,我在这里边直接溜出来行不行呢,这个问题我们一会儿说。我这儿专门给你强调了,目标对象是由代餐构造器传进来的。
17:03
OK。这是什么?这是我们说的啊。装饰者设计模式的基本的用法。这种结构。这种结构基本的结构就是这样的。
我来说两句