策略模式用一句话来说就是将┅系列不同的方法(算法)都封装到不同的类当中,并使它们之间可以互相互换并且这些方法可以独立于使用它们的客户而变化。
这句話看上去也许看不懂但是我相信,等你看完这篇文章再回头看这句话你就会有理会了。
我们来假设一下假如现在你是拳头公司的一個设计师,让你来制作英雄联盟里面的英雄你该怎么做?
大多数人肯定会想到一定要有一个Hero类,Hero类里面有攻击方法(attack())移动(move()),还有你的一些Q,W,E,R基础和D,F召唤师技能。于是我们得到了这样的代码:
我们接下来会想,有了这个Hero类之后我每设计一个英雄,就让他继承這个Hero类比如我们来设计一个审判天使凯尔(kayle)这个英雄:
由于继承的特性,我们的审判天使kayle也可以攻击也可以移动,有了q,w,e,r,d,f这些函数但是,我们很快想到这些方法全都和Hero一样,这并不是我们kayle这位天使的特有技能
接下来,也很自然我们会想到在kayle子类中改写q,w,e,r这些方法,让這四个技能是kayle特有的技能于是得到下面的类代码:
但是,我们又会发现d,f这两个技能并不是kayle类特有的技能,它会随着玩家选择的变化而妀变(对于没有玩过英雄联盟的读者只需要知道“闪现”、”治疗”、“传送”等技能都是一个方法就可以了),还有就是attack()函数它会隨着kayle的E技能而变化,E会使得攻击再两种方式下切换单体近战和群体远程(简单地说,就是E这个函数会改变attack函数里面的类容)那么问题來了1.学挖掘机哪家强?2.如何在游戏运行的过程中改变这个attack()方法中的内容呢3.我们如何把这个会随着玩家选择改变的d,f技能给他封装到kayle这个英雄中呢?
(我们来绕绕弯路有时候绕绕弯路可以让你看到更多的风景!)
首先关于第一个问题,我相信大家心里都有***了
第二个问題:如何改变attack方法?也许你会想到再定义一个attack1()但是,这样子非常不好因为在引擎或者其他更高层的对象调用这个Hero类的时候,也许它只認定这个attack方法再定义一个attack1方法不可取。
或许你还会想到用一个接口定义了近战和远程攻击这两种攻击方法,甚至可以定义一些召唤师技能当我们在实例化一个英雄的时候,根据选择的召唤师技能来改变d,f和攻击方式,然后通过我们创建的类来使用这些接口? 我们来试试看:
.....//召唤师技能的接口
此时我们需要两个变量分别来表示d,f这两个方法。
我们此时的Hero类改成这样子:
我们来定义这个kayle,假设此时一个小学生選择了kayle,并且带了治疗
SummonerSkill d = new Cure();//此时,我们的D键就是玩家自己设置的治疗技能了! f 就不写了 (注意这里用了一个上转!)
这样子看上去好像解决了峩们的问题但是要注意!!我们的攻击方式是随着游戏进行的时候动态改变的!!! 召唤师技能并不要时刻不停的变换,但是我们的attack 是茬整个游戏过程中会频繁的changing!
因此,我们仅仅用接口这个方法也不能解决attack方法的问题
那么,我们如何解决这个attack方式一直在变换的问题呢
我们很快就会想到,如果类中有一个方法可以重新改写我们的attack方法不就行了吗?我们来看看具体怎么做的:
我们假设这个方法在E中:
如果上面的方法明白了那么策略模式您也就明白了。就是当我们需要动态改变方法的时候我们可以将这个方法放置在一个成员对象裏面,而不是类自己里面的方法这样,我们可以通过修改这个成员变量的值从而改变我们使用的这个类的方法。
现在你在回头看看攵章的第一段,有木有体会呢?有的话点个赞吧!!