一,动机
当一个对象的状态发生改变时,有时候我们会希望它的行为也会随着状态的改变而改变。
比如一个人(对象),没钱的时候(状态)晚上只能吃泡面(行为),但是当他有钱了(状态发生改变),那么他就可以大口吃肉了(行为也发生改变)。
这个时候就需要一种方式,在对象的状态发生改变的时候也同样改变它的行为。
State模式就是这样一种模式,允许一个对象在它的内部状态发生改变的时候也改变它的行为,因为行为方法变得不同了,就好像这个类也发生了改变一样。
二,介绍
1.参与者
Context 环境,上下文,定义了用户需要调用的方法,并且维护了ConcreteState的实例,该实例定义了Context的状态。
State 状态,抽象的状态类,用接口定义一个Context在某种状态下的行为。
ConcreteState 具体的状态实现类,实现一个与Context状态相关的行为。
2.协作关系
Context 将与状态有关的请求委托给ConcreteState来处理。
Context 可以将自身作为一个参数传给处理该请求的 ConcreteState 对象。
Context 是主要的用户入口,用户只需与Context打交道,而无需考虑 ConcreteState 。
Context 和 ConcreteState 都可以决定哪个状态是另一个状态的后继状态,以及在什么条件下进行状态转换。
代码示例
public interface State{
public void eat();
}
public class PoorState implements State{
public void eat() {
System.out.println("吃泡面");
}
}
public class RichState implements State{
public void eat() {
System.out.println("吃山珍海味");
}
}
public class Person {
State state;
public void setState(State state){
this.state = state;
}
public void eat(){
this.state.eat();
}
}