Java设计模式之状态模式
状态模式简介
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
**意图:**允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
**主要解决:**对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
**何时使用:**代码中包含大量与对象状态有关的条件语句。
**如何解决:**将各种具体的状态类抽象出来。
基本类图
我们可以看到使用一个中间类Context负责状态的更改和调用不同状态的方法,而使用者不知道具体实现的细节,context类可以省略。
Context 是一个环境角色,它的作用是串联各个状态的过渡,在BaseSate 抽象类中我们定义了并把这个环境角色聚合进来,并传递到了子类,也就是五个具体的实现类中自己根据环境来决定如何进行状态的过渡。
不使用状态模式以电梯为例
电梯自定义有五种状态:开、关、异常、走、停止,每个状态执行不同的方法能够改变状态,并且不同的状态只能能执行特定的方法。
public class NOState {
public static final int CLOSING_STATE = 0;
public static final int FAULT_STATE = 1;
public static final int OPENING_STATE = 2;
public static final int RUNNING_STATE = 3;
public static final int STOPPING_STATE = 4;
private static int state;
/**
* 模拟电梯的运行方法
*/
public void run() {
switch (state) {
case CLOSING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case FAULT_STATE:
// 执行具体的方法
// state = XXXX;
break;
case OPENING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case RUNNING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case STOPPING_STATE:
// 执行具体的方法
// state = XXXX;
break;
default:
break;
}
}
/**
* 模拟电梯的停止方法
*/
public void stop() {
switch (state) {
case CLOSING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case FAULT_STATE:
// 执行具体的方法
// state = XXXX;
break;
case OPENING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case RUNNING_STATE:
// 执行具体的方法
// state = XXXX;
break;
case STOPPING_STATE:
// 执行具体的方法
// state = XXXX;
break;
default:
break;
}
}
/**
* 模拟电梯的开门方法
*/
public void open() {
switch (state) {
ca