什么叫策略模式?
策略模式定义了算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式原则:
例如:第一个一个小游戏,游戏角色:国王、巫师、刺客、卫兵,游戏兵器:刀,剑,匕首,法杖,弓箭,每个角色只能使用一种武器,但是战斗过程中可以切换其它武器。
策略模式定义中的算法族就是我们游戏中使用的兵器,我们现在需要做的就是将所有的兵器封装起来,兵器(算法)的使用者即游戏的角色(客户)
如何封装算法族?
根据设计模式:定一个一个兵器(WeaponsBehavivor)接口,所有的兵器实现兵器接口,并且兵器有一个方法useWeapons;
public interface WeaponBehavivor {
/**
* 使用兵器
*/
public void userWeapons();
}
然后所有的武器实现兵器接口
/**
*剑
*/
public class SwordBehavivor implements WeaponBehavivor {
@Override
public void userWeapons() {
System.out.println("宝剑砍他");
}
}
/**
*匕首
*/
public class KnifeWeaponimplements WeaponBehavivor {
@Override
public void userWeapons() {
System.out.println("匕首刺他");
}
}
....其它的武器实现省略
这样我们就实现好了我们的兵器(算法族)
接下来封装好给我们的客户使用
定一个一个超类Person,这是一个抽象类,Person类有一个方法,打架方法fight。为什么是抽象类呢,因为人是一个比较抽象的,并没有具体指定是那个人,可以是男人、女人、人妖...
public abstract class Person{
WeaponBehavivor weaponBehavivor;
//封装兵器,把算法封装给客户,具体如何使用,客户自己选择
public void setWeaponBehavivor(WeaponBehavivor weaponBehavivor) {
this.weaponBehavivor = weaponBehavivor;
}
/**
* 打架的方法
*/
public void fight(){
//调用兵器
weaponBehavivor.userWeapon();
}
}
接下来我们写个小小的demo来运行一下我们的策略模式:
public class Test{
public static void main(String[] args) {
Person king = new King();
king.setWeaponBehavivor(newSwordBehavivor());//选择宝剑做武器
king.fight();//打架
//宝剑打不过,我要换武器了
king.setWeaponBehavivor(new KnifeWeapon());
//...其它的省略了
}
}