标题
当对象的内部状态改变时,使其行为也随着改变。
优点:
- 将所有与某个特定状态有关的行为封装到一个类中,并且将属于不同状态的行为分割开。使得对象的行为跟随状态变化而变化。
- 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
- 状态对象可以被多个环境对象共享,从而减少系统中对象的个数。
缺点:
- 会增加系统类和对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
- 状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
举例
public class Client {
public static void main(String[] args) {
State state = new State();
Context context = new Context(state);
//设置第一种状态
state.setValue("state1");
context.method();
//设置第二种状态
state.setValue("state2");
context.method();
}
}
class State{
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
//state1时执行
public void method1(){
System.out.println("execute the first opt!");
}
//state2时执行
public void method2(){
System.out.println("execute the second opt!");
}
}
class Context {
private State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void method() {
System.out.println("状态为:" + state.getValue());
if (state.getValue().equals("state1")) {
state.method1();
} else if (state.getValue().equals("state2")) {
state.method2();
}
}
}
Output:
状态为:state1
execute the first opt!
状态为:state2
execute the second opt!