00:03
策略模式在JDK源码中的应用分析,我们来看一下,在JDK咱们找了一下。GDK的A。这个工具类里面呢,他在进行排序的时候,他就用到了这个策略模式。那么它是怎么使用到这个策略模式的呢?它其实是实现了这个compar接口,通过实现compar接口,然后呢,传递不同的策略方法。那么我们来看一段代码来加深对它的认识,好,这里呢,有一段代码,我们先来拿来用一用,然后我们追一下它的源码,好吧。这里我们新建一个类。新建一个类。是。然后呢,我们把主方法勾上。然后呢,在这里边我们来使用一下,同学们可以看到,同学们可以看到这里有一个数组。
01:01
这里有一个数组,那这个数组呢,目前是无序的。对,然后呢,大家可以看到我在这里呢,创建了一个这里,我我干什么呀,我实现了compar,这是个接口啊同学们,我实现了compare接口,说明一下。说明第一点实现了。Comp接口。接口。我们来看一下是不是这样子的,来看一下。我们打开这门,我们发现呢,Competitor的确是个接口,里边呢有一个非常重要的方法叫compare compare。那我们实现这个接口过后呢,对,我们就相当于是使用这个匿名得到一个匿名,对匿名类的一个对象。对不对,那也就是说这一个东西你们可以认为就是一个匿名对象里面有代码号。好,因此呢,我们可以这样认为,就是大家拿到的这个对象。
02:05
这个对象就是什么呢?就是实现了实现了这一个comparor,那这个competitor这个接口,其实在这里我们可以把它看作是什么呀,策略接口没问题吧。它其实就是一个策略结构,因此我们认为这个对象呢,就是实现了策略接口的一个对象。也就是一个具体的策略对象了。那那你具体来说。具体来说,你这个策略方法是在哪里写的呢?就是通过这个方法来指定你的具体的策略,在这个里面呢,指定呢,对指定具体的操作方法,或者是或者说处理方式。处理方式。那从从我们看到,如果O1大于O2,它返回一个一,否则返回一个负一,那这里呢,其实我们可以看出来,它默认是以升序的方式来实现的。
03:00
OK,那现在呢,我们来试一下,是不是这样子呢?来,同学们,我们输出一把。System。找一个,呃呃,当然我我这边还要去调啊,没有调用那是不行的,Are are这个工具类里面有个SH方法。这个烧的方法里面呢,有这么一个方法,第一个参数呢,传入我们的要排序的数组,第二个参数呢,就是传入我们这个策略对象。OK,那显然现在我排序完了,过,我输出一下,用仍然用a.to string把它转换一下,这时我们可以看到该数组是升序排列的。升序排列的,我们自信一把,我们发现这个结果,呃,得到结果应该是这样子的啊,123489完全的正确。那么我们再来看一下这个哨的方法,我们来分析一下这个方方法说明一般OK,同学们可以看到这个哨的方法呢,我们追到这里面,我们发现它这里面有这么一段代码。
04:03
大家看到啊,我把这个代码呢,给各位朋友拿过来。大家有没有发现这段代码,其实啊,其实它是根据你不同的情况来调用我们这个C的,你看如果C。为空,就是它是一个没有实现的,那么我们这里就用默认的方法。来处理,否则的话呢,我选用不同的形式来使用我这一个策略对象是不是,呃,然后下面就是这种方式使用。使用我们怎么样策略对象GC。是不是传进来的,同样他也也有可能是用这种方式来使用。那这里面这个我们就不去管它了,使用策略。对象C。最后呢,根据你的策略你就实现了,那大家想一想,我们目前是一个升序排列,假如你要去把它做成降序排列,应该怎么做呢?其实非常简单,你只需要改变这个compare,因为刚才我们讲过compare呢是指定具体的处理方式,是这样子吧,如果我把这个改成负一,把它改成一,你会看到呢?诶这个时候就变成了降序。
05:09
降序处理。那是不是降序呢?来,现在我们看是不是降序,降序执行之,我们发现呢,诶代码有小问题啊。我们看看哪里写错了。啊,这两个我们把删掉没有用。我们再来运行一把。运营过后,我们可以看到现在四编程呢,降序排列,所以说这个地方就是一个比较经典的策略模式,它怎么实现呢?它通过实现这个策略接口的。呃,实现这个策略接口来指定来得到一个不同的策略对象,然后进行一个处理。对,这是方式一,好,这是这个就是我们的方式一。想你了。方式一,那我给大家简单写一写啊,给他写一写,比如现在呢,我们有另外一个数组,比如说有另外一个数组来。
06:00
DATA2那这里面我分别加一个一也是对跟刚才的不一样好吧。那它怎么用呢?这个简单,他自己这样写的,RA点仍然是short。走,写进去,在这里面呢,我们直接去写我们这个compare的一些方法,比如说我想写这样一句话,vr1.compare。Compare to,谁呢?VR2如果这个大于零,OK啊,我们就返回一个一。S我们返回一个负一,各位在这上面少了分号写完了,那写完以后,也就是说这个时候我们这个哨的方法就处理完了。对,处理完。那这个时候我们来,呃,就是这个SH,因为我在这已然是调用了,对不对,已经调用了,那调用的话呢,我们现在可以来进行一个输出,看看它有没有得到一个相应的变化。哦,我们看看有没有得到相应的变化来输出一把。
07:02
System。System。然后呢,我们在这里输一下就是data。是不是得塔二,那得塔二呢,我们直接等一下加上什么呀,我们看这面不要写错了,R1大于OK,那这面我们就用A把它输出来就行了。第二什么呀?r.two string,然后把data塔二放进去是不样子,同学们,我们运行一下。运行一下,我们看一下这个有没有得到变化呢?好,我们可以看到现在就变成了什么样顺序,看到没有。那当然,如果我把这个策略改变了,变这边改成负一,这边改成一,那同学们可以先可以看到代塔二就是一个呀,降序的明白,看看18是有14 13 12,一,11正确的,好同学们,那这个就是我们的第二种方式是用纳姆达表达式来实现我们这个策略基础。策略模式。
08:01
所以说这个还是很明很明显的,那现在呢,我们对刚才讲的这个东西呢,做几点说明啊,做几点说明,我们来整理一下他的一个思路。呃,这个思路呢,从我们这个图上其实已经看的比较清晰了,对,也就是说这个呢,我们可以看的是策略接口。对策略接口,那这个策略接口谁来实现呢?你看我这里如果第一种方式来看的话,就相当于我用一个匿名类来实现的我6COMP,然后直接在这里。实现了compare方法,是不是其实这个就可以看是对他的一个实现嘛。那这里面的方式呢,你自己该怎么写就怎么写就完了,非常的简单,还有一种方式就是同学们看到我写的第二种方式,第二种方式呢,它是用那么达表达式直接在这里。指定我们的策略。就是compare to,你按你的策略来处理就完事了,非常简单,好,同学们,那关于对这个源码的分析呢,我想这样讲应该说大部分同学都知道是吧,也不是很难。
09:03
角色我也分析了,这就是我们的策略接口,下面这些像这个呢,就是具体的对策略接口实现的对象啊OK,好,那关于对我们。策略模式在JDK的应用源码分析,我们就聊到这里。
我来说两句