在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful
)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
**状态模式(
State Pattern
)**:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States
),状态模式是一种对象行为型模式。
状态模式包含如下角色:
Context
: 环境类State
: 抽象状态角色ConcreteState
: 具体状态角色类首先,是抽象的状态角色接口:
/**
* 抽象状态角色
* Created by blinkfox on 16/7/12.
*/
public interface IState {
/**
* 抽象方法1
*/
void handle1();
/**
* 抽象方法2
*/
void handle2();
}
接下来,是多个具体的状态角色类,分别如下:
/**
* 具体状态角色类1
* Created by blinkfox on 16/7/12.
*/
public class ConcreteState1 implements IState {
/**
* 具体状态角色类1中的方法1
*/
@Override
public void handle1() {
System.out.println("执行了具体状态角色类1中的方法1...");
}
/**
* 具体状态角色类1中的方法2
*/
@Override
public void handle2() {
System.out.println("执行了具体状态角色类1中的方法2...");
}
}
/**
* 具体状态角色类2
* Created by blinkfox on 16/7/12.
*/
public class ConcreteState2 implements IState {
/**
* 具体状态角色类2中的方法1
*/
@Override
public void handle1() {
System.out.println("执行了具体状态角色类2中的方法1...");
}
/**
* 具体状态角色类2中的方法2
*/
@Override
public void handle2() {
System.out.println("执行了具体状态角色类2中的方法2...");
}
}
然后,是环境类:
/**
* 环境角色类
* Created by blinkfox on 16/7/12.
*/
public class Context {
// 当前状态
private IState state;
/**
* 构造方法
* @param state
*/
public Context(IState state) {
this.state = state;
}
/**
* 方法1
*/
public void handle1() {
this.state.handle1();
}
/**
* 方法2
*/
public void handle2() {
this.state.handle2();
}
}
最后,是用于测试状态模式的客户端场景类:
/**
* 状态模式的客户端场景累
* Created by blinkfox on 16/7/12.
*/
public class StateClient {
public static void main(String[] args) {
Context context = new Context(new ConcreteState1());
context.handle1();
context.handle2();
}
}
在状态模式结构中需要理解环境类与抽象状态类的作用:
状态模式的优点:
状态模式的缺点:
在以下情况下可以使用状态模式:
状态模式在工作流或游戏等类型的软件中得以广泛使用,甚至可以用于这些系统的核心功能设计,如在政府OA办公系统中,一个批文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。使用状态模式可以描述工作流对象(如批文)的状态转换以及不同状态下它所具有的行为。