1、策略模式的定义:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
2、示例:游戏角色与武器的功能实现,不同的角色可以使用不同的武器,而且在游戏过程中可以随时切换武器,为了便于扩展,采用策略模式实现。
//角色的超类,所有的角色都继承自此类
public class Character{
WeaponBehavior mWeaponBehavior;//定义所使用的武器接口对象,每种武器都会引用实现WeaponBehavior接口对象
//更多对象
//超类对角色共性的默认实现
.......
//打斗的方法
public void performFight(){
mWeaponBehavior.useWeapon();
}
public void setWeaponBehavior(WeaponBehavior weaponBehavior){
this.mWeaponBehavior=weaponBehavior;
}
}
//国王角色,继承自超类Character
public Class King extends Character{
public King(){
//国王使用SwordBehavior类(宝剑)进行打斗,当performFight()被调用时用宝剑攻击对方
mWeaponBehavior=new SwordBehavior();
//更多对象
......
}
}
//骑士角色,继承自超类Character
public Class Knight extends Character{
public Knight(){
//骑士使用BowAndArrowBehavior类(弓箭)进行打斗,当performFight()被调用时用弓箭攻击对方
mWeaponBehavior=new BowAndArrowBehavior();
//更多对象
......
}
}
//更多种类的角色类实现
......
//武器的接口
public interface WeaponBehavior{
//定义统一的攻击方法
public void useWeapon();
}
//宝剑的实现类
public class SwordBehavior implements WeaponBehavior{
//实现发声的方法
public void useWeapon(){
System.out.println("实现用宝剑攻击");
}
}
//弓箭的实现类
public class BowAndArrowBehavior implements WeaponBehavior{
//实现发声的方法
public void useWeapon(){
System.out.println("实现用弓箭攻击");
}
}
//更多的武器实现类
......
3、总结:此例子虽然简单,但是突出了策略模式的精髓:封装了变化的部分(不同的角色可以使用不同的武器),使变化的部分独立于不变的部分;面向接口编程,而非面向实现编程,使代码更有弹性,并且可以通过setter方法在打斗过程中动态的改变角色所使用的武器;利用组合的方式成功的扩展了对象的功能,避免了利用继承带来的代码重写等问题。
注:此例子模仿深入浅出设计模式一书中关于策略模式的讲解中的例子。