策略模式四个字听起来很多人都可能不是很理解,其实它就是一种简单的设计模式,举个例子啊:现在很多人都喜欢打游戏,游戏中的角色我们最熟悉不过了。角色有分为很多种,不同的角色使用不同的技能或武器。其实这就包含了策略(Strategy)模式。这个设计模式其实就是抽象类与接口的使用。假如你是新手,可以一起和我这样做。
1.我们来分析一下游戏里的技能,技能就是可以造成杀伤力的东西。每个角色的技能都不同。那么我们可以把“技能”单作一个接口。
package org.lxh.dao; public interface WeaponBehavior { public void useWeapon(); //使用武器 }
2.接口弄好了,那么实现类呢?实现类就是对这些技能的一种细化。
package org.lxh.impl; import org.lxh.dao.WeaponBehavior; public class SwordBehavior implements WeaponBehavior { public void useWeapon() { System.out.println("用宝剑挥舞"); } }package org.lxh.impl; import org.lxh.dao.WeaponBehavior; public class KnifeBehavior implements WeaponBehavior { public void useWeapon() { System.out.println("用匕首刺杀"); } }package org.lxh.impl; import org.lxh.dao.WeaponBehavior; public class AxeBehavior implements WeaponBehavior { public void useWeapon() { System.out.println("用斧头砍劈"); } }3.之后我们可以考虑一下,其实每个角色都会发动攻击,也就是使用武器。有时可以切换武器。这些都是每个角色的共同点。不同的则是动作的执行者,基于这些特点,我们可以把“切换武器”和“攻击”写在一个抽象类里。我是这样设计的。
package org.lxh.dao; public abstract class Character { WeaponBehavior weapon; public WeaponBehavior setWeapon(WeaponBehavior wea) //切换武器 { this.weapon=wea; return this.weapon; } public abstract void fight(); //角色之间的打斗或搏击 }4.下面的工作就简单多了,我们可以开始写每个角色的功能了。
这段代码表示皇帝的进攻
package org.lxh.impl; import org.lxh.dao.Character; public class King extends Character { SwordBehavior sw = new SwordBehavior(); KnifeBehavior knife = new KnifeBehavior(); public void fight() { System.out.println("皇帝开始进攻:"); setWeapon(sw).useWeapon(); System.out.println("切换武器之后========="); setWeapon(knife).useWeapon(); } }下面的代码则是爵士的进攻;
package org.lxh.impl; import org.lxh.dao.Character; public class Knight extends Character{ AxeBehavior axe=new AxeBehavior(); KnifeBehavior knife=new KnifeBehavior(); public void fight(){ System.out.println("爵士开始进攻:"); setWeapon(axe).useWeapon(); System.out.println("切换武器之后========="); setWeapon(knife).useWeapon(); } }
当然了角色还有很多,有兴趣的话可以自己添加一些角色。
5.编写测试类
package test; import org.lxh.impl.King; import org.lxh.impl.Knight; public class Test { public static void main(String[] args) { King k=new King(); Knight kt=new Knight(); k.fight(); kt.fight(); } }下面就是运行的效果截图。
好了,这就是策略模式了。如果代码有错或者有看不懂的地方,可以写评论或者通过qq和我交流,我的qq号是1214273312,加我的时候请注明“csdn网友“就可以了。我一般都在线。