1.策略模式定义:
定义了算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
2.定义场景:
一个动作冒险游戏,里面有多个角色,每个角色每次只能使用一种武器,但是游戏中武器是可以更换的,例如你刷出了一把魔剑拥有它可以横扫全服,此时是不是很想把他装备到自己来体验屠戮的快感呢。
游戏里面有各种角色,在这个尚武的王国里,人人都好战。所以每一个人物都有fight行为。打斗是需要武器的。但是武器又是多种的。尚武的王国里人人都会使用各种武器。打斗的过程中也可以更换武器。所以武器行为是多变的,例如时代变了要跟换武器系统了。要适应这种变化,提高程序的扩展性。所以我们将变化的提取出来,作为接口的方式组合到client中,通过面向接口编程的方式来适应这种变化。所以我们把这组行为(算法簇)定义为,他们独立与client的。他们之间是可以相互替换的,这就叫做策略模式。
下面我们模拟一个骑士的战斗场景:
1.武器系统接口定义:WeaponBehavior.java
public interface WeaponBehavior { public void useWeapon(); }2.定义武器:
public class BowAndAnowBehavior implements WeaponBehavior { public BowAndAnowBehavior() { // TODO Auto-generated constructor stub } @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("我使用弓箭攻击!!"); } }
public class KnifeBehavior implements WeaponBehavior { public KnifeBehavior() { // TODO Auto-generated constructor stub } @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("我用小刀攻击!!!"); } } public class SwordBehavior implements WeaponBehavior { public SwordBehavior() { // TODO Auto-generated constructor stub } @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("我用宝剑攻击!!!"); } }
public class AxeBehavior implements WeaponBehavior { public AxeBehavior() { // TODO Auto-generated constructor stub } @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("我用斧子攻击!!!"); } }
public class Character { //注入武器系统 public WeaponBehavior weaponBehavior; public Character() { // TODO Auto-generated constructor stub } /** * 攻击方法 */ public void fight(){ weaponBehavior.useWeapon(); } /** * 注入相应的武器 * @param weaponBehavior */ public void setWeaponBehavior(WeaponBehavior weaponBehavior) { this.weaponBehavior = weaponBehavior; } }
public class Knight extends Character { public Knight(){ System.out.println("我是英勇的骑士!!!"); } }
public class KnightTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Knight knight=new Knight(); System.out.println("我是王国的骑士:詹姆斯"); System.out.println("开始战斗吧!!"); knight.setWeaponBehavior(new SwordBehavior()); knight.fight(); System.out.println("等等我要求跟换武器!!!"); knight.setWeaponBehavior(new AxeBehavior()); knight.fight(); } }
我是英勇的骑士!!! 我是王国的骑士:詹姆斯 开始战斗吧!! 我用宝剑攻击!!! 等等我要求跟换武器!!! 我用斧子攻击!!!