JAVA状态模式(打boss案例)

定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

源码地址:https://gitee.com/yang-kairui/design-pattern

状态模式实际上就是模拟一个有限状态机,不同状态采取不同的处理方式,我们以一个打boss的小案例为例:

先创建一个Boss实体类

public class Boss {

   /**
    * 名称
    */
   private String name;

   /**
    * 生命值
    */
   private double life;

   /**
    * 防御力
    */
   private double def;
    //Getter Setter...
}

创建一个状态机顶级接口:

public interface State {

   /**
    * 玩家攻击
    *
    * @param atk 玩家攻击力
    * @param crit 玩家暴击倍率
    * @return
    */
   void attack(double atk, double crit);

}

创建三个状态机,分别是防御、暴击、击倒

public class DefendState implements State {

   private Boss boss;

   public DefendState(Boss boss) {
      this.boss = boss;
   }

   @Override
   public void attack(double atk, double crit) {
      double dmg = atk - boss.getDef();
      boss.setLife(boss.getLife() - dmg);
      System.out.println("对"+boss.getName()+"发起了攻击,造成了" + dmg + "点伤害," + (boss.getLife() > 0 ? "boss剩余血量" + boss.getLife() : "boss已被击倒!"));
   }
}
public class CriticalState implements State {

   private Boss boss;

   public CriticalState(Boss boss) {
      this.boss = boss;
   }

   @Override
   public void attack(double atk, double crit) {
      double dmg = atk * crit - boss.getDef();
      boss.setLife(boss.getLife() - dmg);
      System.out.println("对" + boss.getName() + "造成了暴击,造成了" + dmg + "点伤害," + (boss.getLife() > 0 ? "boss剩余血量" + boss.getLife() : "boss已被击倒!"));
   }
}
public class DeadState implements State {

   private Boss boss;

   public DeadState(Boss boss) {
      this.boss = boss;
   }

   @Override
   public void attack(double atk, double crit) {
      System.out.println("boss" + boss.getName() + "已被击倒,无法造成伤害");
   }
}

最后,我们来测试打boss过程,看看状态是怎么影响打boss行为的

public class StateTest {

   public static void main(String[] args) {
      Boss boss = new Boss("哥布林国王", 100.0, 20.0);
      System.out.println(boss.getName() + "出现了,血量" + boss.getLife() + ",防御力" + boss.getDef());
      new DefendState(boss).attack(60.0, 0.0);
      System.out.println("获得装备无尽之刃,攻击变为暴击,暴击倍率225%");
      new CriticalState(boss).attack(60.0, 2.25);
      new DeadState(boss).attack(40.0, 2.25);
   }
}

哥布林国王出现了,血量100.0,防御力20.0
对哥布林国王发起了攻击,造成了40.0点伤害,boss剩余血量60.0
获得装备无尽之刃,攻击变为暴击,暴击倍率225%
对哥布林国王造成了暴击,造成了115.0点伤害,boss已被击倒!
boss哥布林国王已被击倒,无法造成伤害

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值