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("我用斧子攻击!!!");
}
}
3接着定义人物超类:Character.java
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;
}
}
4.定义我们的骑士:Knight.java
public class Knight extends Character {
public Knight(){
System.out.println("我是英勇的骑士!!!");
}
}
5.定义我们的测试类;KnightTest.java
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();
}
}
好了所有的准备工作都已经完成。让我们的骑士开始战斗吧。输出结果:
我是英勇的骑士!!!
我是王国的骑士:詹姆斯
开始战斗吧!!
我用宝剑攻击!!!
等等我要求跟换武器!!!
我用斧子攻击!!!