00:00
Java设计模式之策略模式。看一个关于鸭子的问题。现在呢,要求同学们去完成一个鸭子的项目,具体的要求是这样子的,说现在呢有各种各样的鸭子,有野鸭,北京鸭,水鸭。那么鸭子呢,有各种各样的行为,比如说它会叫,会飞翔对不对等等吧,等等,那么现在呢,要求写一段代码来把这一个。各种各样的鸭子以及他们的行为进行一个管理,并显示他们的信息。需求很简单,也很明确,那么我们来现在看一下,如果我们使用传统的方式来解决怎么解决,以及传统的方法会存在什么问题。大家来看,如果我们用传统方案解决压轴的问题呢?一般是这样做的。我们写一个大。把它做成一个负类。
01:00
对,这个大坑呢,也可以把它做成一个抽象类,也可以做成一个非抽象类,然后呢,下面呢,有各种具体的鸭子。啊,比如说野鸭,水鸭,北京鸭,玩具鸭,那么这些鸭子呢,去继承这个大可如果它有相同的行为,我们就怎么样啊,就继承,如果有不同的行为,我们就重写,大致是这样的思路,那么这种方案其实是其实要从解决问题来说呢,是OK的,但是呢,它会存在一些问题。具体存在什么样的问题,我们用代码给大家实现,实现了过后我看有什么问题,然后就在这个代码上进行改进,OK,好,同学们,那现在呢,我们打开eclipse,我们来用先用传统的这种继承的方式来解决压值的显示问题。打开eclipse。
02:07
好的,那现在在这个项目里边呢,我们写上。一个包。来。因为现在讲的是策略模式,所以说我写个strategy。这个单词是strategy,是策略的仪式。我就建这么一个包,然后呢,我用传统的方式来解决,对传统方式呢,就是跟刚才老师所说的,呃,一个类图的形式来看一下。对,传统方式,传统方式刚才我已经讲了,首先呢,我会做一个类,OK,这个类呢,一般可以把它做成一个抽象类。抽象类,然后这里面呢,有一系列的方法。有一系列方法,比如说嗯,他有。它有什么方法呢?比如说他有这个叫的方法叫CRY啊,交换交换CRY啊,这个叫呢,咱们叫这个单词吧。
03:05
然后呢,还有什么方法呢?OK,鸭子呢,我们认为是可以游泳的,对不对,大部分鸭子呢,都可以swimming。这个没问题,对不对?那么我们还认为鸭子可以干什么呢?OK,鸭子呢,可以飞翔,FLY。我们把这个呢做成一个抽象类,下边呢我们有各种具体的鸭子来实现它,比如说野鸭wide duck。没吧,同学们,然后还有什么鸭子呢?OK,我们还有这个,刚才我们所说的有北北北京鸭,Picking。Picking。对不对,Duck。还有什么压制呢?等等吧,我就不写那么多了,比如说我们还有玩具鸭,比如说还有玩具鸭对不对,Duck。没问题吧,同学们,其他鸭子我就不画了,然后呢,我们让这些具体的子类去继承这个大。
04:00
没问题,好思路我们有了,那现在呢,我们来写一下这个用传统方案来完成的项目。按照刚才的示意,我们先建一个大,并且呢,做成abstract及抽象类。好的。那这时我们做哪些呢?首先。我们需要一个对不对,构构造器。构造器。我们做一个构造器,大的构造器,这个不要了。那么下面呢,紧接着我们来写他前面写的这么几个方法,Public void这个。他可以叫。那么我们认为呢,鸭子在通常情况下呢,鸭子就是嘎嘎叫鸭子。啊,怎么样嘎。胛脊。问题吧,鸭子嘎嘎叫好,那紧接着我们还有一些什么呢?Public VO的鸭子,鸭子呢,还会有我游泳对不对,因为在这这个地方呢,我会有些默认实现。
05:07
这边我们写上鸭子会游泳。鸭子会游泳对吧?游泳OK啊,那么鸭子还会什么呢?我们认为鸭子呢,还能够飞翔,FLY。非常简单,对不对,我们写上这个代码。就叫鸭子会游泳。鸭子会飞翔。好的。那紧接着还有一个,不要忘了,前面我们有个需求还要显示鸭子的信息,但是不同的鸭子呢,它的名字不一样,所以说这个地方我们就可以把它写成一个抽象方法。Abstract,然后这边我们写个形式叫VO Dis play。写一句话啊,这个地方就是显示鸭子的信息,显示鸭子。信息。好的,那同学们看,一个抽象类就写完了,紧接着我们来根据刚才的分析,我们先写什么呢?好的,我们先写野鸭,你会发现问题就会逐渐的暴露出来。
06:08
来,我们先写野鸭wide duck。那么同学们都知道野鸭呢,同学们,野鸭其实的确哈,走走一阵,先把这个继承一下。我们知道。页页这里有个抽象方法去实现它。我想把这个写上。走,我们就叫这是一只什么,这个就叫野鸭。这事也要。那同学们知道野鸭的的确确满足这个几个要求,野鸭呢,嘎嘎叫,野鸭子呢会游泳,野鸭子也会飞翔,这个呢很轻松,就说如果你写的是个野鸭,其实它默认的,也就是说他从duck里面这个类继承下来的这些方法呢,咱们可以直接使用这个没有问题,对不对?好,紧接着我们来看北京鸭。
07:00
OK啊,我们再看本压有什么问题没有?Picking。我看这个北京一该是paint啊,这样painting吧,Picking duck。然后我们让北京鸭呢也去继承大没问题吧,我们让北京鸭也去继承这个duck没有任何的问题。那么北京要在继承这个大的时候呢,有一个方法就必须要重新覆盖了,先把这个写上。我们写着。这是北京央。北京呀,北京。对,好的。那北京鸭我们来看看他如果用负类的方法,哪个是不能用的呢?我们知道北京鸭也是嘎嘎叫,可以用,北京鸭也会游泳,但是北京鸭呢,我们认为它是不能飞翔的。对,它可不像野鸭可以分享,北京鸭呢,不能分享,因此这个FLY方法我们就需要重写写句话,因为因为北京鸭。
08:02
不能,对,不能飞翔。飞翔。因此,需要。需要重写什么呢,来?好,这个当然是同学们可以想到的嘛,因为他不能分享,所以我们要重想,因此我在这写一句话叫什么呢?北京鸭不能分享。这个也是很正常的,因为你就重写一个方法,于是就写了北京鸭。北京压不能飞翔。好的。好,这就可以用了,但问题继续往下走,下面呢,我们又写了一个什么呀,玩具呀。问题来了,那如果是玩具呀,你们有没有发现他的问题,是怎样做的呢?大家想一想,我们写个toy。Duck。好,玩具鸭呢,我们也让他去继承,对同学们看,我们也让玩具鸭去继承我们这个duck。首先呢,我们去把它的抽象方法实现,我们写上一句话。
09:02
这么我们叫做什么呀,玩具玩。具样对,不能这样写啊,玩具呀。OK,那玩具呀,大家想,我们来看看他从腹内继承下来的方法,哪个可以用?玩具鸭肯定是不能叫的。他不能叫玩具嘛。玩具要显然也不能游泳对吧,因为它不能动啊,它是个玩具。还有呢,玩具呀,显然也不能飞翔,所以说这就意味着这一个玩具呀,需要需要重写父类的所有方法。所有,这就出现了一个问题。那换言之,就说你从这个父类继承相方法,其实你都需要重写。那待会我们来分析好,那这我就省个事儿,我就把这几个方法呢,咱们就复制过来改一下就行了,好吧,这边我们写个叫玩具呀,不能叫玩具。
10:00
文具呀。不能。不能叫,OK,那玩具鸭干什么呢?不会游泳啊,不会游泳。不会游泳玩具呀。干什么呢?他也不会飞翔。玩具下不会飞翔。好,同学们。代码写完了我们要用,当然这个没什么问题,你写一个去使用没有任何问题,我就不写这个C端了,同学们也知道怎么用,创建它的一个对象去调用就可以了,这里测试我们就免了。测试,那么我们来分析一下传统方案带来的问题。各位我们可以看到。传统方法实现呢它的问题分析和解决方案,首先其他的鸭子它都继承了大类,所以FLY呢让所有子类都分享了,这是不正确的。好,上面说的第一个问题,其实是继承大类问题,就说因为我们子类只要继承了父类。
11:04
他就继承了,他属于方法。Public的方法,那其实这是继承带来的问题,所以说我们说继承呢,他在有些时候其实是。不好的。那么这时如果对距对内进行局部改动,尤其是超内的局部改动,也会影响到其他部分,就会有溢出效应。就你的超内改变呢,所有的子类都会受影响,这叫溢出效应。那么为了改进的问题呢?我们可以通过覆盖FLY问题来解决。是不是比如说刚才我们讲的这个北京北京鸭,我们其实只需要重新。重新覆盖或者重写一下FLY就可以了,但是带来的问题是哪里呢?问题又来了。问题是,如果我们有个玩具呀,Toy talk,这就需要toy Du去覆盖大所有实现的方法。这个就不值当了。但是我们又希望他跟这个大有一定的关系。
12:01
就是他有些行为我们要用,有些行为不用,而且不用的行为还挺多,怎么办呢?好,同学们,这就引出了我们的策略模式。这个策略模式的叫。TE。Strategy这个strategy pet就是这个就是我们的策略模式,那具体策略模式它怎么来解决这个问题呢?它其实核心思想就是将我们的继承换成组合或者是聚合来解决这个方这个方式还是非常的优秀的一种解决方案,就是这个设计模式呢,确实是在一定程度上解决了很多问题。那具体来说,这个策略模式是什么概念?我们下一个视频为大家讲解。
我来说两句