允许一个对象在其内部状态改变时改变它的行为。
适用场景:
一、一个对象的行为取决于他的状态,并且它必须在运行时根据状态改变它
的行为;
二、一个操作中含有庞大的多分支条件语句,并且这些分支依赖于该对象的
状态。
状态模式的主要优点在于封装了转换规则,其缺点在于使用状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂.
源码如下:
//1、定义一个抽象状态类
public interface State {
//状态对应的处理
public void handle(String sampleParameter);
}
//2、一个State类型的对象实例 维护状态的变化
public class Context {
private State state;
public void setState(final State state) {
this.state = state;
}
// 用户感兴趣的接口方法
public void request(final String sampleParameter) {
// 转调state来处理
state.handle(sampleParameter);
}
}
//3、状态变化类
public class StateA implements State {
@Override
public void handle(final String sampleParameter) {
System.out.println("StateA handle :" + sampleParameter);
}
}
//4、状态变化类
public class StateB implements State {
@Override
public void handle(final String sampleParameter) {
System.out.println("StateA handle :" + sampleParameter);
}
}
//客户端
public class StateTest {
public static void main(final String[] args) {
final Context context = new Context();
final State stateA = new StateA();
// final State stateB = new StateB();
context.setState(stateA);
context.request("test");
}
}
S t a t e模式提供了一个更好的方法来组织与特定状态相关的代码。决定状态转移的逻辑不在单块的i f或s w i t c h语句中, 而是分布在S t a t e子类之间。将每一个状态转换和动作封装到一个类中,就把着眼点从执行状态提高到整个对象的状态。这将使代码结构化并使其意图更加清晰。