Appearance
状态模式
定义
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
优点
- 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
- 允许状态转换逻辑与对象业务逻辑分离。
- 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点
- 状态模式的使用必然会增加系统类和对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
代码示例
java
public interface RoleState {
void attack();
void move();
void releaseSkill();
}
java
public class Role {
private RoleState roleState;
public Role() {
this.roleState = new NormalState();
}
public RoleState getRoleState() {
return roleState;
}
public void setRoleState(RoleState roleState) {
this.roleState = roleState;
}
public void attack() {
roleState.attack();
}
public void move() {
roleState.move();
}
public void releaseSkill() {
roleState.releaseSkill();
}
}
java
public class AttackState implements RoleState{
@Override
public void attack() {
// 攻击
System.out.println("攻击状态攻击,继续攻击");
}
@Override
public void move() {
System.out.println("攻击状态移动,取消攻击,开始移动");
}
@Override
public void releaseSkill() {
System.out.println("攻击状态施放技能,取消攻击,释放技能");
}
}
java
public class FlyState implements RoleState{
@Override
public void attack() {
System.out.println("击飞状态不能攻击");
}
@Override
public void move() {
System.out.println("击飞状态不能移动");
}
@Override
public void releaseSkill() {
System.out.println("击飞状态不能施放技能");
}
}
java
public class NormalState implements RoleState{
@Override
public void attack() {
// 普攻
System.out.println("正常状态攻击,开始攻击");
}
@Override
public void move() {
// 移动
System.out.println("正常状态移动,开始移动");
}
@Override
public void releaseSkill() {
// 释放技能
System.out.println("正常状态释放技能,释放技能");
}
}
java
public class VertigoState implements RoleState{
@Override
public void attack() {
System.out.println("眩晕状态,无法攻击");
}
@Override
public void move() {
System.out.println("眩晕状态,无法移动");
}
@Override
public void releaseSkill() {
System.out.println("眩晕状态,无法释放技能");
}
}
java
public class Client {
public static void main(String[] args) {
Role role = new Role();
role.move();
role.attack();
role.releaseSkill();
role.setRoleState(new FlyState());
role.move();
role.attack();
role.releaseSkill();
role.setRoleState(new VertigoState());
role.move();
role.attack();
role.releaseSkill();
role.setRoleState(new AttackState());
role.move();
role.attack();
role.releaseSkill();
}
}
运行结果:
txt
正常状态移动,开始移动
正常状态攻击,开始攻击
正常状态释放技能,释放技能
击飞状态不能移动
击飞状态不能攻击
击飞状态不能施放技能
眩晕状态,无法移动
眩晕状态,无法攻击
眩晕状态,无法释放技能
攻击状态移动,取消攻击,开始移动
攻击状态攻击,继续攻击
攻击状态施放技能,取消攻击,释放技能