策略这两个字乍一听上去有点像三国志游戏里,那些鬼点子特别多的谋士出的阴谋阳谋之类的。但在面向对象的软件世界中,策略的范围要比谋略广很多。
我想以一款网络游戏来描述这个模式,玩过魔兽世界的人都知道它是比较早引入地下城(Dungeon)概念的游戏之一。地下城里有各种妖魔鬼怪给玩家砍啊杀啊。杀死boss后会掉落玩家所需要的各种装备。地下城从低级到高级,种类繁多,适合不同等级的玩家去探险刷装备。其中一些特殊的地下城因为难度较高,对玩家的人数有要求,需要组队才能通过冒险。越高难度需要的人数越多,当然奖励也会越丰厚。
比如著名的黑龙公主巢穴,这个地下城可以支持10人组队和25人组队两种游戏难度。组队在游戏中指的是由一名队长(玩家)联合其他玩家组成一个小队,一起完成冒险。队长必须先选定难度(比如10人或者25人),再开始召集各路好手,进入地下城探险。
闲聊结束。
接下来,让我们从游戏设计者的角度来看待这个问题。刚开始的设计应该是这样的。一切看上去很简单。
后来游戏开发者突发奇想,觉得25人也没有挑战性了,又想增加难度,加入一个40人组队的难度。
其实在加入40人难度时,合格的设计者就会开始思考,将来是否还会加入60人甚至80人难度?
根据不同难度,分别初始化地下城。其实初始化这个动作本身就可以看做一种策略。策略模式也可以在此发挥它的长处。
我们现在需要定义三种策略,策略其实就是一种动作,如果用计算机语言描述约等于算法(后面统一用算法来代替动作这个名词)。
如下图所示
到这里其实还没有真正发挥策略模式的优点。
如果用抽象的概念来看,这三个动作其实都一样,只是具体算法不同。在抽象的世界里应该是下图这样
这样做的好处是如果以后要加入60人或者80人的地下城,程序的结构会非常清晰。
上面的结构其实就是策略模式的典型应用,当然到这里还没有结束。那么如何应用策略呢。
我想用伪代码的形式来说明策略模式的应用,分为不使用模式和使用模式:
1、应用策略模式之前,看到的应该是这样的逻辑:
//如果是10人地下城
//初始化10人地下城
//否则如果是25地下城
//初始化25人地下城
.....
2、应用策略模式之后,看到的应该是这样的逻辑:
//根据玩家人数初始化对应的地下城(统一入口)
不使用模式的做法在算法不是非常多的情况下非常适合。套用程序员的白话讲就是把代码逻辑写死。
但第二种更灵活,并且很方便扩展。因为人数是动态的,策略模式带来的好处是明显的,就是在程序运行时动态地替换算法。而不用把代码写死。
关于如何用代码实现策略模式,网上有很多文章,使了用各种语言,不管是C++,C#,Java还是动态语言来说明和讲解。都讲的很多,这里就不再重复。
最后来总结一下策略模式的使用,大体实现都是两步:
第一步:针对每种策略抽象各自的算法。使各算法可以互不影响。
第二步:提供统一入口。用于根据指定条件来替换算法。
版权声明:本文为博主原创文章,未经博主允许不得转载。