策略模式定义
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 — Head First
策略模式四步走:
- 把会经常变化的方法或行为提取出来,委托给行为类。
- 定义一个行为接口来概括这一类行为,并把具体的行为写成类来实现这个接口(构建多态的条件),这样变化的行为就和超类分离开来。
- 建立超类和接口的联系,需要在超类中定义接口类型的引用变量,并在这个超类里创建一个委托行为方法,在其中用接口变量去调用这个委托行为。
- 在子类的构造方法中实例化特定行为,并赋值给超类继承来的接口引用变量,以此达到具体行为适配的作用。
Dota版策略模式 - Java实现
DotaHero类 :
public abstract class DotaHero {
/*首先用接口技能类型声明两个引用变量,所有英雄都继承它们*/
BlinkSkill blinkSkill;
HealSkill healSkill;
public DotaHero(){}
/*blink和heal委托给行为类*/
public void performBlink(){
blinkSkill.blink();
}
public void performHeal(){
healSkill.heal();
}
/*动态赋予技能的方法*/
public void setBlinkSkill(BlinkSkill bb){
blinkSkill = bb;
}
public void setHealSkill(HealSkill hb){
healSkill = hb;
}
/*通用方法*/
public void run(){
System.out.println("All heros run");
}
public void attack(){
System.out.println("All heros attack");
}
public void speak(){
System.out.println("All heros speak");
}
}
敌法师AM类 :
public class AM extends DotaHero{
public AM(){
/*构造方法里初始化技能*/
blinkSkill = new BlinkUsingMana();
healSkill = new HealNoWay();
};
public void show(){
System.out.println("我是徐志雷!");
}
}
闪烁技能BlinkSkill接口 :
public interface BlinkSkill {
public void blink();
}
BlinkSkill接口的两个行为实现类 :
public class BlinkUsingMana implements BlinkSkill{
public void blink(){
System.out.println("Blinking!");
}
}
public class BlinkNoWay implements BlinkSkill{
public void blink(){
System.out.println("No such skill!");
}
}
HealSkill接口 :
public interface HealSkill {
public void heal();
}
HealSkill接口的三个行为实现类 :
public class HealWithMuchMana implements HealSkill{
public void heal(){
System.out.println("Heal using much mana!");
}
}
public class HealWithLittleMana implements HealSkill{
public void heal(){
System.out.println("Heal using little mana!");
}
}
public class HealNoWay implements HealSkill{
public void heal(){
System.out.println("No such skill!");
}
}
Dota英雄测试类DotaHeroTester :
public class DotaHeroTester {
public static void main(String[] args){
DotaHero am = new AM();
am.performBlink();
am.performHeal();
}
}
输出:
-Blinking!
-No such skill!
如果想动态的给敌法师赋予新技能:
public class DotaHeroTester {
public static void main(String[] args){
DotaHero am = new AM();
am.performBlink();
//动态的赋予敌法师加血的技能
am.setHealSkill(new HealWithMuchMana())
am.performHeal();
}
}
输出:
-Blinking!
-Heal using much mana!