Dota版策略模式(Strategy Pattern) - Java实现

策略模式定义

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 — Head First

策略模式四步走:

  1. 把会经常变化的方法或行为提取出来,委托给行为类。
  2. 定义一个行为接口来概括这一类行为,并把具体的行为写成类来实现这个接口(构建多态的条件),这样变化的行为就和超类分离开来。
  3. 建立超类和接口的联系,需要在超类中定义接口类型的引用变量,并在这个超类里创建一个委托行为方法,在其中用接口变量去调用这个委托行为。
  4. 在子类的构造方法中实例化特定行为,并赋值给超类继承来的接口引用变量,以此达到具体行为适配的作用。

Dota版策略模式 - Java实现

Dota版策略模式

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!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值