00:01
使用策略模式来解决压制的问题,需求前面我们已经说过了,我们就不再聊了,我们现在直接来说思路分析,然后呢,这边我们画出对应的类图。用类图来描述我们想用策略模式怎么去解决打开eclipse,我们来写一下。好的,那我们就在这写吧。我们写一个包包在下面呢,写个叫improve,对它的一个改进。Prove improve,然后在这里面呢,我们新建一个类图,没问题吧,同学们,那这个类图呢,我们就取一个比较简单的名字,就叫duck。OK。那现在根据我们前面对策略模式的了解,我们应该先写什么呢?来吧,首先呢,各位同学,我们先写这个策略接口,大家想一想。我们前面这个大里面是不是有这样一些行为啊。就是qua。叫。Swim,还有这个FLY,那这样子我们认为呢,假如我们认为所有的鸭子都会游泳,不管你是不是鸭,玩具鸭,玩具鸭放在水上呢,也能漂起来,对不对?我们认为所有的鸭子呢都可以游泳,但是呢,并不是所有的鸭子都能够叫,也不是所有的鸭子都能飞翔。
01:18
假如这样子啊,我们假定这样子的,那这样子呢,我们就认为这个qua,还有这个FLY呢,是一种策略就是不同的。鸭子的种类,它使用不同的策略,于是乎我们就怎么办呢?各位朋友,那我们现在就抽取出来一个策略接口,什么策略接口呢?就是FLY,飞翔的FLY。FLY的这个HAB。Behavior这个单词这样写啊,Behavior。那这个接口里面呢,就是我们的飞翔里面有一个方法叫FLY。注意听啊,FLY。
02:01
这是我们的一个接口,那么这个接口呢,我们认为就是所有的鸭子呢,它的对飞翔这个行为呢,有不同的处理方案,或者说有不同的策略,我们认为有这么几个方式,第一种呢,就是有些鸭子它是不可以飞的,所以说我们写一个叫low fly low fly behavior。没问题吧,我们让他呢去实现这个策略接口。同样的道理,我们认为呢,还有一种压制,它是非常非常好的,我们取个名字叫good。Behavior。没问题吧,我们认为还有一种鸭子,他的他的飞翔行为是他是特别擅长飞翔的,也去实现。问题,我们认为还有一种压制呢,他的行为是什么呢?Bad虽然能飞,但是飞的不高,比如说叫做bad blind什么呢?Behavior。
03:04
没问题吧,同样我们也让他去实现,所以同学们可以看到针对飞翔这个行为,或者针对飞翔这个动作,我们有不同的策略了,而且实现值,那现在呢,我们再写一个类,叫做什么呢?Duck。Do CK duck。那duck它怎么样呢?同学们,Duck呢?我们现在不是有三种鸭子吗?一种是北京鸭,Picking。Duck。OK,好,还有什么鸭呢?还有就是我们所说的这个野鸭,Wide duck。没理吧,同学们。好,假设这又是一种压制,我们还有一种压制呢,就是玩具鸭toy,玩具duck。我们让他干什么呢?我们让他去实现,呃,继承这个大可类。是继承呢,同学们。
04:00
那接着过大家想一想,在这个duck里面它有行为,所以说我们给它聚合进来,也就是说在dock里面呢,至少应该有个属性,这个属性呢,我们。我们就叫这个FLY吧。FLY的一个behavior。V or类型,类型就是这个接口类型叫FLY。Be behavior。V behavior,好的,那显然这两者之间的关系呢,就是一个聚合或者是组合的关系啊,如果你是直接给他,那么这个就是,呃,如果是直接给他就是组合,如果是通过构造器付给他的,我们就叫聚合。好,这就是一种行为,那当然有同学说了,说老师那你。分享有这样的行为,那么他的这一个我们叫做什么呢?就是叫不同的叫声是不是也有相同的接口呢?是的,你还你还可以写个接口叫。
05:01
七。哎。呃,这个叫这个应该怎么写,Ack是吧,Qua behavior。AV or,所以说这里面呢,它也有又是一个接口,这个接口里面呢,它有一个行为就是。教。Quack OK,那同样道理,我也可以给他设置不同的子类来实现,当然这个呢,就看同学们愿意去写就写了,啊,我这四个亿就行了,比如说呃,是咯咯叫。啊,去比比哥哥这个夸behavior。没问题吧,同样我们让这个下面的子类去实现。这个接口,这个策略接口,但是呢,它可能还有一个叫,有些鸭子呢,它是不能叫的,对吧,或者说有些鸭子是呃嘎嘎叫嘎嘎。Quack behavior。
06:00
对不对?好,这又是一种行为,这个地方有点太小了啊,同学们太小,往那边挪一挪。好。当然我们认为还有一些鸭子呢,它是什么呀?它是哑巴,它不能叫好,所以说我们还有一种类,比如说同学们。还有一类是什么呢?就是哑巴,他不能叫我们叫做can't,就是no啊,No。Quackha。那我们也让他去实现好,同学们可以看到现在是不是又有又有这么几种情况,那同样我们认为这个鸭子呢,它还有一种,诶就写错了,还有属性。还有什么属性呢?就是发出较深的这么一种属性,我们也把它聚合进来就可以了。比如说叫。跨跨behavior。AV or类型类型对也是这种接口类型,Qua什么呢?Behavior。
07:04
好,同样我们也将这一个接口以接口的形式呢,给它聚合进来。说实大家应该知知道啊,就是我们这说通过接口的形式聚合,其实本质是聚合这个接口下面具体的实现子类,这点大家要非常的清晰,好我们示意图就画完了。那有了这个示意图,我们对这个改进是不是就非常的方便了呀?来同学们,现在我们开始改进,首先呢,我们,呃,当然我写的时候,我可能就写一个哈,我写一个一个这样的fly behavior,像这个跨behavior写不写呢,同学们也也应该很清楚的知道是什么意思就可以了,好吗?我们只要把这个设计模式的思想讲清楚就可以了。诶,好,我们先写这个FLY。这是一个接口。好,我们先写第一个接口。对,FLY什么呢?Fly be heavier。
08:00
OK behavior。好,下面呢,我们我们这肯定是有一个方法的,也就是说在这个接口里面呢,我们会写一个方法,这个方法呢,叫VO fly子类。它下面的子类去具体实现。子类具体实现即可。对不对,好,现在呢,根据刚才的分析,我们应该有三个吧。有三个,第一个呢是good。Good。Good fly。Behavior。好让,然后呢,我们让这个呢,去实现这个接口。大家注意听哈,这个。其实挺有意思的,那实现我们认为这这种鸭子,如果他的行为是飞翔的比较好说,我们写个飞行,飞翔技术,飞翔技术高超。技术高超哦,这是特别擅长飞翔的一一种压制。然后呢,我们再来写一种,还有一种鸭子呢,它是什么呀,它是败的。
09:04
他飞行技术不行,Bad。Fly behavior。好,我们让这个类呢,也去实现我们这一个接口。这个接口呢,仍然是fly behavior。协商。好,我在这里实验这个方法,然后我在这里写一句话叫什么呢?就说这个鸭子飞翔技术不行,飞翔技术一般。OK,还有一种呢,就是不能飞翔的,我们叫做刚才我们写的这个名字叫什么呀?叫做no fly behavior,好,也写进去好吧。一会儿就把这个搞清楚了,No fly behavior。好的,然后我们让这个类呢,也去实现这个策略接口,对的。Fly behavior。然后这边写上就说该鸭子不会飞翔,比如说玩具鸭它就飞不起来,写上这里就说啊不,不会飞不。
10:05
不会飞翔,OK,好同学们,那到此呢,我们这边这一套这个策略咱们就定好了,然后写上我们鸭子,鸭子这一块,北京鸭,野鸭,玩具鸭是不是大体我们都有了,我把这个代码呢,怎么样拉过来。我就不再写了好吗?我把它拿过来,放到这边来。OK啊。OK,那这边呢,给我肯定要做一个改进,首先压制这个地方呢,呃,我们可以看到。既然你这个鸭子是这样子的,所以说大家可以想象到。在我们这个鸭子里边,它应该去聚合,它有属性呢,什么属性呢,就是策略。对,策略接口,策略接口,那么现在我们来写一个,比如说我们认为它有FLY。Behavior,那至于它具体是什么的,我们就放到这了。
11:02
对,当然他还可以有其他的。其他的属性也是跟我们这个策略策略接口关联的。我们这是不是定了一个接口啊,当然给接口其实本质是给他的什么呀,给他的这个对子类,好,这个写完了过后大家想我们display写成抽象的没有问题,但下面这几个方法,比如像这个呃,FLY这个方法,咱们就不要去写了。对,不要去写了,因为你本身是个抽象类,写也没什么实际意义,所以这这对对他进行一个改进。那么我们怎么改进呢?我们下一句话,如果我们这个fly behavior。它不等于空。它不等于空,说明什么呢?同学们说明。说明这个behavior这个策略接口,你已经给他把一个具体的子类给到他了。那如果给到他,我就直接调这个接口里边的FLY方法就完事了。
12:03
大家看是不是这种道理啊?是不是这样?道理其实特别简单。那既然如此,各位同学来。各位同学这样如此,那下面我们这些个具体的鸭子是不是应该处理一下,首先我们找到这个野鸭。那么同学们看野鸭这个地方是不是我们要去调它的什么?同学们是不是要要用构造器写个构造器传入,传入什么呢?就是FLY。Behavior。Be behavior的一个对象,是这样子吗?那么我们把构造器给到他就行了。好给哥哥,诶这边给哥哥的,给哥哥的气。诶,这个写错了啊。给到一个构造器,那我们这个构造器就这样写了public。液压。对,在这里面呢。我们这个比较好,我们把它的这一个FLY行为进行一个进行一个初始化,另有一个什么呢?Good,我们认为野鸭呢,它的飞行技术very good。
13:09
等于写完了。对不对,同样我们认为这个北京压呢,对北京压同样要进行一个初始化,是不是同学们,那当然这个地方Fla的方法我们就不要继续重写了。大家看为什么呢?因为你FLY方法在我们的这个大里面其实是有处理的,你看这个野压我们这个地方Fla是不是没去处理,那到了这个地方。这个北京鸭呢,我们就这样去处理,不要写它了,把这个呢就拿掉。拿掉,拿掉过后,我们仍然写一个北京压的构造器。对,在这里我们去。初始化,初始化它的这个FLY行为要一个什么呢?我们认为北京鸭呢,呃,它是可以飞,但是飞的不好。飞翔技术不行,哎,我们看原先是怎么写的啊,测一下。哦,他说北京鸭,他说是不可以飞翔的,呃,北京虾不要不能分享,那不能飞翔,我们就写这个东西了。
14:08
好,根据前面的思路来整就行了,好吧,他既然不能飞翔,我们就这样写给他一个FLY海表等于六一个什么呢楼。叫做low they have。是不是好,我们还有一个玩具鸭。玩具鸭呢?呃,大家可以看到玩具鸭这个行为,FLY呢,我们也不要在这写了。对不对,那怎么办呢?同样通过一个构造器去处理就可以了,来看这里,同样我们把toy。构造器给他,那嗯,玩具啊呢,我们认为也是不可以飞翔的。同样,我们来初始化它的fly behavior这个行为要一个什么呢?把它放进去,诶,这个地方是写错了啊六一个。No。Flap。Behavior,好,这样子写完了以后,同学们可以看到,当我们再去使用的时候,这个行为就可以控制住了。
15:06
对吧,那同样我们既然把这个写完了,我们同样来做,对于这个较深的一个处理,那较深这个处理我看看就,要不就没有必要再写了,因为大家大致大致应该知道,如果我们在写,把这一套写下来,其实也是一个思路。其实也也是一个思路,对不对,那么我们通过这个behavior接口呢,来控制不同压制的行为,我们也可以通过这个跨behavior这种这这个策略方式呢,来控制不同压制的什么样,他的这个较深的行为。那这个时候我们来做一个测试,看看这个行为有没有控制住,来走一个client。OK,勾上我们的主方法。勾上我们主方法,那么来测试一下。我们直接六一个。又一个野鸭。六只野鸭六好。搞定了对不对,其他你都不要管了,然后呢,第二我们解压的方法,比如说点压点FLY。
16:05
其实这个时候这个里压它会告诉我们它的飞翔技术非常棒,好我们运行一下,同学们可以看到这个人提示性说飞翔技术高超,那如果说我们再留一个什么呢?玩具鸭子,诶玩具呀,Toy。Toy Du。好,这时呢,我们来调用玩具呀。To Du,它也可以飞翔,它有飞翔的行为,所以我一写呢,他说这个鸭子是不会飞翔的。对,北京鸭一样,嗯,北京央,我们这给它构建的也是一个no fly behavior,假如我们这样定啊,我们认为北京鸭呢,可以飞是飞常技术很差,假如,假如北京鸦,北京鸭可以飞翔。飞翔,但是飞翔技术很差。飞翔技术。一般那这个时候呢,我也可以这样去处理来,也就说大家可以看到他的行为,就说我们可以用这种接口去控制他的行为。
17:07
OK,去控制他的行为点怎么样呢?我们写到这里面叫做。呃,那就是一般都是,就是我们叫bad。Bed。Behavior,对不对?Bad behavior,如果这样子的话呢,我们来去构建一个北京鸭,大家可以看到六一个picking。Duck。对,然后呢,我们来调用北京鸭的Fla的方法,我们可以看到这是他说这个鸭这种鸭子的呢,飞翔技术一般。所以大家可以看到这时我们这个类就是同学们看到这个类呢。就他这里面的行为啊,就可以通过我们这个属性去控制。属性去控制了,当然有同学说老师我能不能动态的变化呢?比如说我对某个压制的行为,我能不能动态的去变化呢?其实也是可以的,其实也是可以的,你比如说同学们看在这里。
18:03
在这个位置在大可因为在某个行为,我们假如希望去改,在运行过程中去改变它的某一个,呃,FLY的这个具体动作,我们还可以提供一个set方法,是不是同学们是不是还还可以提供一个set方法来看代码。R,对,我对这一个FLY呢,提供一个晒的方法。诶,同学们可以看到,同学们可以看到,当我的这一个大壳类有有了下列方法,它下面的子类是不是也拥有拥有这个方法了,打个比方,打个比方,我们可以这样去玩一把,大家看,假如我们又认为北京鸭,其实呃,刚才那个初始化是错的,我们认为北京鸭。确实飞不起来,比如我们要去改变啊,我们动态的改变。改变。改变某个某个这个对象的行为。那我们可以办什么?我们认为北京鸭真的是,呃,刚才你说北京鸭能够飞翔是吧,我就是没没有把名字打出来,我如果把名字打出来,这个是可以的啊,比如说你在这个鸭子里面再有个名字构建的时候,把名字打出来,说这是野鸭飞翔技术高超,这个是什么呀?呃,玩具鸭不会飞翔,这个是北京鸭飞翔技术一般。
19:19
我这个可以加个属性,我就没写了啊,因为我现在讲的是策略模式,那如果说我们改变认为我们是认为什么呢?北京鸭真的就是飞不起来北京鸭。被惊讶,不能是不能飞。我们要改变一下,那这个时候其实特别简单,我set一下他的新的行为,给他一个新的新的一个对象放进去就可以了,OK,当然你还可以用新的,嗯,其他方式啊,我就直接给了一个,那我们认为它是什么呢?他是真的不能飞。就诺。Behavior。给他了,给他以后同学们看,我们再来去掉这一个他的FLY方法。那这个时候呢,我们提示一句话就是什么呢?北京鸭的新的行为,北京鸭。
20:05
的实际。对,实实际就写上了。实际飞翔行为、飞翔能力,飞翔能力。那这个时候呢,你会发现。他会提示说分享技术就是不能分享啊,不能分享大家看一下。他原先是北京要实际飞翔能力是不会飞翔。好,这个就是我们的策略模式的一种思路,那同学们注意呃,要是大家有时间的话呢,可以把这套方案也再引进去。就是说你们也可以把这个写进去,那如果把这个写进去的话呢,呃,那大致大致就这样子的啊,我四个亿我就写一个接口,其他我不写了好吗?K跨。跨behavior。好,它是一个接口,这个接口里面呢,我们认为有个方法,就是它的叫声VO quack。做成一个抽象类,让什么呢子类去实现。
21:02
对,只能去实现就可以了。对吧,诶我们这个写法跟前面这个是保持一致就可以了,这是他的这边是之类的好。那这个时候呢,同学们可以看到,如果这样写,我们这个鸭子里边呢,就会拥有一个新的策略,比如说它的一个什么呢?Qua behavior。对。同样的道理,同样道理,这边也可以给他一个晒的方法。对不对,Set什么呢?我们看一下set,我们他的这个行为就可以了。同样下面子类也就相当于它下面子类也就继承了这样一个结构,那你下面的鸭子,比如说北京鸭,你也可以去初初始化它的。这个较深的行为一样的道理,我就不去写了,各位同学,那关于我们使用使用什么呢?策略模式来解决压制的问题就讲到这里,大家看是不是这个这种策略还是非常不错的吧。
22:00
就是说他把这个什么呢,把原先这个行为由我们的这种继承这种模式转换成聚合或者是组合方式,那这样子呢,我们就把一个使用者,你可以认为这是个算法。就是这是使用者。使用我们算法的对象,而这边是我们算法的提供者。是不是那这样子呢,就把使用者和提供者怎么样解偶了。你需要什么,就给你什么。你需要什么就给你什么,而且它的它下面还有指令呢,也并不会去,并不会去继承他的这些,呃,不是固定的这种行为。非常的好,好的,那关于我们这个内容呢,就给大家讲解到这里。
我来说两句