世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- 意图
允许对象的内部状态改变时,改变其行为。 - 类图
- 实例
interface State {
/**
* 执行
* @param ctx 记录状态
*/
void exc(Context ctx);
/**
* 打印name
* @param name 名称
*/
void name (String name);
}
static class State1 implements State {
@Override
public void exc(Context ctx) {
ctx.setSt(this);
}
@Override
public void name (String name) {
System.out.println("state1 --- " + name);
}
}
static class State2 implements State {
@Override
public void exc(Context ctx) {
ctx.setSt(this);
}
@Override
public void name (String name) {
System.out.println("state2 --- " + name);
}
}
static class Context {
private State st;
public State getSt() {
return st;
}
public void setSt(State st) {
this.st = st;
}
}
- 测试
public static void main(String[] args) {
LinkedList<State> stL = new LinkedList<>();
stL.offer(new State1());
stL.offer(new State2());
// 对象的装载与调用应该是分开的,要不然起不到相应的作用,当然这种规则应该属于职责链范畴
String name = "myName";
Context ctx = new Context();
stL.forEach(st -> {
// 对象状态改变与行为调用的方法都应该是接口定义的规范,如果是合成模式,就可以做到分层调用的一致性
// 再加上状态模式就是特别好的组合了
st.exc(ctx);
ctx.getSt().name(name);
});
}
运行结果:
state1 --- myName
state2 --- myName