第22章:状态模式-处理对象的多种状态及其相互转换
定义:
状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
结构:
代码实现:
//抽象状态类
abstract class State {
//声明抽象业务方法,不同的具体状态类可以不同的实现
public abstract void handle();
}
//具体状态类
class ConcreteState extends State {
public void handle() {
//方法具体实现代码
}
}
//环境类:拥有多种状态的对象
class Context {
private State state; //维持一个对抽象状态对象的引用
private int value; //其他属性值,该属性值的变化可能会导致对象状态发生变化
//设置状态对象
public void setState(State state) {
this.state = state;
}
public void request() {
//其他代码
state.handle(); //调用状态对象的业务方法
//其他代码
}
}
- 可以在环境类中提供专门方法进行状态转换
public void changeState() {
//判断属性值,根据属性值进行状态转换
if (value == 0) {
this.setState(new ConcreteStateA());
} else if (value == 1) {
this.setState(new javaConcreteStateB());
}
//......
}
- 也可以在具体状态类中提供专门方法进行状态转换
public void changeState(Context ctx) {
//根据环境对象中的属性值进行状态转换
if (ctx.getValue() == 1) {
ctx.setState(new ConcreteStateB());
} else if (ctx.getValue() == 2) {
ctx.setState(new ConcreteStateC());
}
//......
}
应用实例:
银行信用卡系统
账户三种状态:
- 账户余额>=0,正常状态,可存可取
- -2000<账户余额<0,透支状态,可存可取,计算利息
- 账户余额=-2000,受限状态,只能存,计算利息
package wgg;
//账户类
class Account {
private String state; //状态
private int balance; //余额
//......
//存款操作
public void deposit() {
//存款
stateCheck();
}
//取款操作
public void withdraw() {
//账户为正常或透支状态时可取
if (state.equalsIgnoreCase("NormalState") || state.equalsIgnoreCase("OverdraftState")) {
//取款
stateCheck();
} else {
//取款受限
}
}
//计算利息操作
public void computeInterest() {
if (state.equalsIgnoreCase("OverdraftState") || state.equalsIgnoreCase("RestrictedState")) {
//计算利息
}
}
//状态检查和转换操作
public void stateCheck() {
if (balance >= 0) {
state = "NormalState";
} else if (balance > -2000 && balance < 0) {
state = "OverdraftState";
} else if (balance == -2000) {
state = "RestrictedState";
} else if (balance < -2000) {
//操作受限
}
}
//......