状态模式的定义与特点
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
状态模式是一种对象行为型模式,其主要优点如下:
- 结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
- 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
- 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。
状态模式的主要缺点如下: - 状态模式的使用必然会增加系统的类与对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
- 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。
应用场景
某纸牌游戏软件中,人物角色具有人门级(Primary)、熟练级(Secondary),高手绍(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加和分,失败则扣除积分。人门级具有最基本的游戏功能 play(),熟练级增加丁游戏胜利积分加倍功能doubleScore),高手级在熟练级基础上再增加换牌功能 changeCards(),骨灰级在高手级基础上再增加偷看他人的牌功能 peekCards()。现使用状态模式来设计该系统,绘制类图并编程实现。
所用模式结构视图
实现代码
context对象
public class Oyy22Player {
private String name;
private Oyy22State state;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Oyy22State getState() {
return state;
}
public void setState(Oyy22State state) {
this.state = state;
}
public Oyy22Player(String name) {
this.name = name;
this.state = new Oyy22PrimaryState(this);
}
public void play_win() {
state.play_win();
}
public void play_lose() {
state.play_lose();
}
public void doubleScore() {
state.doubleScore();
}
public void changeCards() {
state.changeCards();
}
public void peekCards() {
state.peekCards();
}
}
状态类
public abstract class Oyy22State {
protected String rankName;
protected int point;
protected Oyy22Playe