目录
0、定义
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
1、状态模式的三种角色
- 环境(Context):环境 是一个类,该类有抽象状态 (State)声明的变量,可以引用任何具体状态 类的实例。用户对该环境(Context)类的实例在某种状态下的行为感兴趣。
- 抽象状态(State):抽象状态 是一个接口或抽象类。抽象状态 中定义了与环境(Context)的一个特定状态相关的若干个方法。
- 具体状态(Concrete State):具体状态 是实现抽象状态的类。
2、状态模式的UML类图
3、示例代码
抽象状态
java
package xyz.jangle.design.state;
/**
* 抽象状态
* @author Administrator
*
*/
public abstract class State {
public abstract void handle();
}
具体状态A (对拓展开放,可创建多个具体状态)
java
package xyz.jangle.design.state;
public class ConcreteStateA extends State {
@Override
public void handle() {
System.out.println("to do something A ");
}
}
具体状态B
java
package xyz.jangle.design.state;
public class ConcreteStateB extends State {
@Override
public void handle() {
System.out.println("to do something B ");
}
}
环境(上下文)(对修改关闭)
java
package xyz.jangle.design.state;
public class Context {
private State state;
public void request() {
if(state != null)
state.handle();
}
public void setState(State state) {
this.state = state;
}
}
客户端(使用)
java
package xyz.jangle.design.state;
/**
* 状态模式
* @author Administrator
*
*/
public class AppMain20 {
public static void main(String[] args) {
ConcreteStateA stateA = new ConcreteStateA();
Context context = new Context();
context.setState(stateA);
context.request();
context.setState(new ConcreteStateB()); //切换状态B
context.request();
}
}
运行结果
bash
to do something A
to do something B