当一个对象的内在状态改变时允许改变其行为,这和对象看起来像是改变了其类(将与特定状态相关的行为局部化,并将不同状态的行为局部化,并将不同状态的行为分割来),当行为依赖于状态时那么状态模式很适用
具体状态类:
@AllArgsConstructor
abstract class AbstractState {
protected String name;
/**
* 状态执行方法
* @param context 持有状态的上下文
*/
abstract void handle(Context context);
}
class ConcreteStateA extends AbstractState {
ConcreteStateA(String name) {
super(name);
}
@Override
public void handle(Context context) {
context.setState(new ConcreteStateB("ConcreteStateB"));
}
}
class ConcreteStateB extends AbstractState {
ConcreteStateB(String name) {
super(name);
}
@Override
public void handle(Context context) {
context.setState(new ConcreteStateA("ConcreteStateA"));
}
}
持有状态的上下文:
@Log4j2
@AllArgsConstructor
@Data
class Context {
private AbstractState state;
public void request() {
log.info("当前状态:{}", state.name);
state.handle(this);
}
}
运用:
Context context = new Context(new ConcreteStateA("ConcreteStateA"));
context.request();
context.request();
context.request();
context.request();
context.request();
结果:
16:40:49.688 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateB
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateB
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA