定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
源码地址: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哥布林国王已被击倒,无法造成伤害