定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
适用性
许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的算法。
需要使用一个算法的不同变体。例如,你可能会定义一些反映不容的空间/时间权衡的算法。当这些变体实现了一个算法的类层次时[H087],可以使用策略模式。
算法使用客户不应该知道的数据。可以使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
例子:以下的例子取自一个动作冒险游戏。你将看到代表游戏角色的类和角色可以使用的武器行为的类。每个角色一次只能只用一种武器,但是可以在游戏的过程中切换武器。
1:定义武器接口及实现类
package strategy;
/**
* 定义武器行为接口
* @author User
*
*/
public interface WeaponBehavior {
public void userWeapon();//选择所使用的武器
}
package strategy;
public class BowAndArrorBehavior implements WeaponBehavior {
/**
* 实现用弓箭射击
*/
public void userWeapon() {
System.out.println("用弓箭射击");
}
}
package strategy;
public class SwordBehavior implements WeaponBehavior {
/**
* 实现用宝剑攻击行为
*/
public void userWeapon() {
System.out.println("用宝剑攻击!!");
}
}
package strategy;
public class KnightBehavior implements WeaponBehavior {
/**
* 实现用匕首刺杀的行为
*/
public void userWeapon() {
System.out.println("用匕首刺杀!!");
}
}
2:定义角色
package strategy;
/**
* 角色的抽象父类 定义抽象fight方法以及策略属性
* @author User
*
*/
public abstract class Character {
protected WeaponBehavior weapon;//策略调用 武器
public abstract void fight();
protected String name;
//委托给行为类
public void performFight(){
System.out.print(name+":");
weapon.userWeapon();
}
/**
* 改变所使用的武器
* @param weapon
*/
public void setWeapon(WeaponBehavior weapon) {
this.weapon = weapon;
}
}
package strategy;
public class King extends Character {
public King(){
this.weapon=new SwordBehavior();//用宝剑
this.name="King";
}
@Override
public void fight() {
System.out.println("King fight");
}
}
package strategy;
public class Queen extends Character {
public Queen(){
this.weapon=new KnightBehavior();
this.name="queen";
}
@Override
public void fight() {
System.out.println("queen fight");
}
}
3:测试类
package strategy;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//定义能够使用的武器
SwordBehavior swordBehavior=new SwordBehavior();
KnightBehavior knightBehavior=new KnightBehavior();
BowAndArrorBehavior bowAndArrorBehavior=new BowAndArrorBehavior();
//定义角色
Character king=new King();
Character queen=new Queen();
//使用默认的武器
System.out.println("**************使用默认武器****************");
king.performFight();
queen.performFight();
//切换武器
king.setWeapon(knightBehavior);
queen.setWeapon(swordBehavior);
System.out.println("**************更换武器后****************");
king.performFight();
queen.performFight();
}
}
4:结果
**************使用默认武器****************
King:用宝剑攻击!!
queen:用匕首刺杀!!
**************更换武器后****************
King:用匕首刺杀!!
queen:用宝剑攻击!!