适用:对象状态影响行为,在不同状态下行为不同,经常需要改变状态来完成不同行为时,类似于多个if-else语句并列使用或switch语句的适用情况.
结构:
1、状态接口,规定了“通过改变状态达到改变行为目的的方法”;
2、具体的状态对象,实现“状态接口”;
3、主题类和状态接口发生关联。
注意:每一个状态对象都必须清楚地知道自己的下一个状态。
要点:
1、State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
2、每一个状态对象的职责会更加明确。
例
接口IState.java
package demo;
public interface IState {
public void change(Luzi lz);
}
//关闭状态下会响应的行为OffState.java
package demo;
public class OffState implements IState {
public void change(Luzi lz) {
lz.setState(new SmallState());//改变炉子的属性
System.out.println("小火状态时的行为");
}
}
//小火状态下会响应的行为SmallState.java
package demo;
public class SmallState implements IState {
public void change(Luzi lz) {
lz.setState(new LargeState());
System.out.println("执行大火状态下的行为");
}
}
//大火状态下会响应的行为LargeState.java
package demo;
public class LargeState implements IState {
public void change(Luzi lz) {
lz.setState(new OffState());
System.out.println("执行关闭状态下的行为");
}
}
//炉子实体类
package demo;
public class Luzi {
private IState state = null;//状态
public Luzi(){
state = new OffState();//初使时炉子当然是处于关闭状态的
}
public void setState(IState state) {
this.state = state;
}
public void push() {//改变状态的行为,从而达到改变行为的目的
state.change(this);
}
}
//调用
package demo;
public class TestMain {
public static void main(String[] args) {
Luzi lz = new Luzi();
lz.push();
lz.push();
lz.push();
}
}
结果:
小火状态时的行为
执行大火状态下的行为
执行关闭状态下的行为
第一次构造时用关闭的状态去实例化一个炉子,这个炉子的push()方法即为 OffState对象的 change(Luzi lz)方法,而在此change(Luzi )方法中调用了 lz.setState(new SmallState()),这样这个lz对象就被赋值为SmallState对象,这样实现了流程的向下进行.