状态模式允许一个对象在其内部状态改变的时候改变其行为。他把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
/**
* 环境角色
*/
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void sampleOperation() {
state.sampleOperation();
}
}
/**
* 抽象状态角色
*/
public interface State {
public void sampleOperation();
}
/**
* 具体状态角色
*/
public class ConcreteState1 implements State{
public void sampleOperation() {
System.out.println("ConcreteState1");
}
}
/**
* 具体状态角色
*/
public class ConcreteState2 implements State {
public void sampleOperation() {
System.out.println("ConcreteState2");
}
}
public class Client {
public static void main(String[] args) {
Context context = new Context();
ConcreteState1 concreteState1 = new ConcreteState1();
ConcreteState2 concreteState2 = new ConcreteState2();
context.setState(concreteState1);
context.sampleOperation();
context.setState(concreteState2);
context.sampleOperation();
}
}
状态模式和策略模式的区别:
一个简单的方法就是考察环境角色是否有明显的状态和状态过滤。如果环境只有一个状态,那么就应当使用策略模式。
而状态模式则适用于另一种情况,即环境角色有明显的转移。
另一个是策略模式的环境类自己选择一个具体策略类,而状态模式的环境类是被外在原因放在一个具体状态中。