00:03
各位,我们来看一下对象适配器。那么我们前面讲的类适配器呢?我们发现它。有一个继承的关系,对,所以说呢,我们这个对象适配器呢,就针对继承的这个问题呢,做了一定的调整,我们来看一下它是怎么来处理的。首先我们看对象适配器呢,它的基本思路和类的适配器是相同的,只是将我们这个adapter,也就是适配器内呢做了一个调整。怎么样调整呢?它不再是继承src类,也就是说它不再是继承这个被适配的这个类,而是持有。这个被适配的类的实例,换言之就是说它是相当于说这个A。B。现在变成什么呢?变成一个持有,也就是说聚合到我把B的一个实例,这个B就是我们被适配的这个类,他把这个被适配的这个类的实例干什么呢?聚合到我们这个A中,这个A就是我们就是就是就是这个适配器明白即持有SR类实现DST。
01:16
这个DTZ的接口完成从源到目的的一个适配。那我们说的再直接一点,就是使用,我们前面讲过的符合合成复用原则。用这个原则来处理继承的,在系统中我们尽量使用关联的关系来替代继承的关系,明白所以说对象适配器呢,对象适配器这个模式也是我们适配器模式里面常用的一种,这是对对象适配器的基本介绍,那下面呢,我们这样子,我们用对象适配器。来改进前面的类适配器。这个案例。还是以哪个为例呢?还是以生活中充电器的例子来讲解,还是一样啊,充电器本身呢?呃,我们相当于做一个适配,将220伏的一个电压转成我们的目标电压五伏。
02:13
现在呢,使用对象适配器来完成,那首先我们来看它的核心思想,那它的核心思想呢,主要是去修改我们这个适配器类。大家还记不记得在前面讲的时候呢,我们这个适配器类它是干什么呀,它是继承我们。这一个呃,被适配的类同时实现这个接口,现在呢,不了,现在只是实现这个接口,然后在他的这一个成员变量里边,或者叫属性里边呢,只有这个被适配的类就完了,所以你看这里只有VNTV2220这对象不再是继承了。大家明白哈,那现在呢,我们把对象适配器的对对应的这个类图画一下,然后用代码将其实现来打开我们的。
03:06
同样我们在这里呢,新建一个包包。OK啊,我们新建一个包包。这个包呢,我们改一个名字叫object。因为是对象适配嘛,我就简写object or doctor。没问题哈,呃,那首先我们还是老规矩,先把这个图画一画,这个图跟前面这个图其实是非常相似的,对吧,所以说我呢,也不用重画,把这个复制过来。然后呢,我们新建一个类图,把他们之间的关系描述清楚。在这在对象适配器这个包包里面,我们把它粘过来。好,来看看。它的一个大体的变化,在什么地方变化。首先呢,这个volunteer adapter呢,仍然要去实现我们这一个接口,这个是没有问题的。但是现在这个adapter和我们被适配的内呢,不再是泛化的关系,也就是说不再是继承的关系,怎么办呢?各位朋友,我会在这里。
04:09
同学们可以看到我会在adapter里面呢加一个属性,各位我加一个属性,这个属性是这样写哈,比方说呃,这边我们写一个VO vont VO,然后220。它的类型呢,各位同学,它的类型呢,就是volume。220V。OK,那它和这两个之间的关系是什么呢?我们把它称之为聚合。啊,聚合金就是说我把它给你,而不是说我去继承,对,那怎么样去把这个东西给它放到这呢?我会有一个构造器,我在构造器或者赛的方法都行哈,那我在这呢,会有个构造器把它传进去就可以了,那大家看我这怎么写。OK。那待会儿呢,我会写这么一个东西。
05:01
A volume。对不对,Adapter adapter在这里面我们会传入,呃,传入一个词,就是比如说VO。Well you。220V对吧,把它传进去就可以了,就是这个东西我们传进去,我这里面有一个v v touch。220V好。就这样子,也就是说我们通过构造器呢,呃,这这个地方,你用一个对它的对象实力把它把通过这个构造器跟他产生一个什么呀,产生一个依赖或者传递就可以了。同样那phone phone这个地方change机呢,仍然是用这个接口的,也就说在充电的时候呢,我仍然是找这个接口,哪里呢,就是这仍然有一个接口,比如说。Teacher。我为。OK,还是按这个接口来做就行了,VO。
06:00
五位。好,那大致的关系大家可以看到就这样子的了,我这个phone呢,仍然是通过这个接口去依赖,那接口依赖的时候,其实也是通过这个接口去找到adapter嘛,这这个是肯定的,然后adapter通过这个,通过这个构造器,大家可以看到这里,通过这个构造器呢,把这个实例传给他。那他当然这里面代码就可以进行进行这个输出和或者是处理了,那这个client怎么用呢?Client这个地方呢,各位同学可以看到还是要去用到它。还是要用到这个phone,再用到哪里呢?还要用到这个,是不是还是要用到我们这个VO adapter,呃,当然client这方还需要用到VNT220符,因为我会通过构造器来传进去,所以它呢,这个地方这个关系也会形成,就client这个地方会多一个操作,就是要六一个,要六一个VNT220V的这个实例传给我们vnt adapter,然后在这里面我们想办法去进行一个什么呀。
07:04
进行一个适配,或者叫进行一个转换,图呢就变成这样子了,大家理解。好同学,那现在我们把代码给大家写一把,因为它的代码跟前面大部分是相同的,所以说我无需全部重写,我复制一下,大家看我代码怎么改一下就行了,好吧,我复制到这边来,跟着我的思路。OK,我们改,我们首先按这个顺序来来写,首先接口无需改变。接口无需改变。就是我们这个接口的方法呢,不动还是适配的接口,还是OUTPUT55伏。没有问题,那下面呢,我们来看一下它的这个被适配的类是谁呢?是它这个地方有变化吗?大家想这个地方呢,也无需变化,是不是无需变化,因为你还是要输出提供一个220伏的一个电压嘛,这个不变啊,不用变。不变,不变。
08:01
好,这个写完了,那现在呢,我们回头来看这个了。回头来看,这两个都写完了,对吧,现在我们写ball adapter,这个变化呢是有的,看这里,首先继承关系怎么样,我们有了。那现在我怎么做呢?来跟上我的一个思路,那现在首先我们做一个属性对不对,V220V。然后这边呢,我们有一个这样的属性给他。因为我需要得到220伏二百二的一个电压,所以拿到,那怎么样给它传进去呢?我们做一个构造器,对,做一个构造器。构造器啊,这个构造器得有参数对吧?C。那我们这边写一个。C,呃,这个是个O。啊,这写错了O。好,把这个传进去就可以了,大家可以看到,在这里呢,我会接收一个V220V的一个对象实例,然后传到这里面去就完事了,对不对,好这就OK,那这方我们要写个this,不然的话这方要出问题。
09:12
好吧,就这是代表代表通过这个构造器呢,给我们传入一个对象实例写出来,通过通过构造器传入一个什么呢。V220V的实力。OK,这这个地方体现出什么什么什么关系,是不是关联关系里面的聚合关联关系。关系中的什么关系,聚合关系明白,那当然这边输出代码肯定要变化了,为啥?因为你在这个地方啊,同学们,你输出一个五伏,那显然这个代码就要做相应变化,因为你没有继承,人家就没这个方法,我们把这个代码呢,重新写一下来。把代码重新给他敲一敲,敲一敲啊呃,首先我先定一个DST等于零。
10:06
这是目标的。那现在我们做判断,如果。这一个已经关联上了,因为你你有可能没有没有传进去,或者传错了是吧,我要首先判断你到底现在是否为空,如果他不为空,把空写到前面去好一点,那不等于它。说明什么呀,说明你这个地方的。这个V220V是已经创建好了,或者是已经关联上了,现在我拿到。220伏的一个电压怎么拿呢?就是V20点什么呀,OUTPUT20这个地方是获取220。的一个电压。没问题吧,拿到拿到过后,我们这个地方提示一句话,比如现在我们用的是使用对象适配器进行转化,我我主要是为了区别跟前面不一样,提示了一句话,你们在实际开发中可以不写啊,进行一个适配。
11:08
或者转换都可以,那怎么转呢?DST等于我们src怎么样,仍然是除以44没问题吧,同学们仍然是除以44,除以44过后呢,我们仍然提示一句话,提示什么话啊,适配完成。适配完成,那完成干什么呢?我们输出的电压,输出的电压为等于加上这就是DST,然后把这个处理好,这个电压呢给返回去DST,其实这个就是五伏嘛,你二百二里面返回一个220伏的一个电压除以44变成五伏。OK,这个代码就写完了,那换言之,我们哪个也写完了,这个这个这个写完了,现在我们写form。放呢,跟前面几乎没有什么变化,是不是,你看你这边还是一样的嘛,还是通过接口来玩的,那么拿到一个五伏,我们就说可以充电的,如果大于五伏或者是呃不正确,那么我们就就就不去处理它就完了,就说不能充电,Client要变化。
12:11
可呢,我们这边改成类适配,呃,这对象对象适配器,那对象适配器,我们这个刚根据刚才的分析电话我们还是要依赖的,要要得到一个电话下面呢,我们这个地方。Volunteer adapt,它需要传入一个什么呀?被适配的这个类的对象实例V20就可以了。大家看到变化就在这里,也就是说原先这个地方你是不需要去创建的,因为你是继承,现在因为我们变成了一个聚合关系,所以说要传入V220V就可以了。好,同学们,我们玩一把,看看代码是否OK。看看代码是否OK来运行值。那运行过后呢,我们发现没有任何问题,大家看现在我们已经变成了对象适配器模式,这提示的是使用对象适配器进行适配,那么我们得到的是220伏,输出的是一个五伏,电压为五伏,可以充电。
13:11
代码就写完了,其实你这地方呢,主要是把这个图的关系搞懂,核心的地方变化就在这里是吧,这是最核心的变化,由继承变成了聚合。使用的一个原则是合成复用原则。好了,同学们,代码咱们就说到这里,那现在呢,我们对对象适配器它的一个注意事项。做一些简单的对象适配器和类适配器,其实本质是一种一种思想,只是实现方式不同而已。那实现方式是根据合成复用原则,用组合替代了继承,所以它解决了类适配器必须继承这个src类的局限性,这个src就是我们被适配的类。而而且也不再要求必须是个接口了啊,同时呢,降低我们的成本,成本更低,更加灵活,OK,同学们,那这个适配器模式的第二种方式对象适配器。
14:08
就给同学们聊到这里。
我来说两句