定义算法族,封装算法,让算法之间可以相互替换;算法的变化不会影响使用算法的客户。
我们在玩游戏的时候有武器weapon,我们要在武器之间相互转换,一会用枪,一会用刀,一会用炸弹,我们不管使用何种武器,最终目的都是一样-消灭敌人。
Weapon:
package com.sosop.strategy;
public interface Weapon {
void action();
}
Gun:
package com.sosop.strategy;
public class Gun implements Weapon {
@Override
public void action() {
System.out.println("使用枪射击");
}
}
Knife:
package com.sosop.strategy;
public class knife implements Weapon {
@Override
public void action() {
System.out.println("使用刀攻击");
}
}
Bomb:
package com.sosop.strategy;
public class Bomb implements Weapon {
@Override
public void action() {
System.out.println("使炸弹攻击");
}
}
Soldier:
package com.sosop.strategy;
public abstract class Soldier {
private Weapon weapon;
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
protected void fight() {
weapon.action();
}
}
Enemy:
package com.sosop.strategy;
public class Enemy extends Soldier {
}
Test:
package com.sosop.strategy;
public class TestStrategy {
public static void main(String[] args) {
Soldier soldier = new Enemy();
Weapon weapon = new Gun();
soldier.setWeapon(weapon);
soldier.fight();
weapon = new knife();
soldier.setWeapon(weapon);
soldier.fight();
}
}
什么时候需要用策略模式
接口不能解决代码的复用,继承不能体现全部行为的时候
模式解析
策略模式定义路一系列算法,算法完成的工作都是相同的,只是每种算法的实现不同,正如上面例子,武器完成的工作都是消灭敌人,但是用刀用枪由用户决定。
用户可以动态的切换算法,就如把枪换成炸弹。
每个算法是一个单独的类,使单元测试更加方便