状态模式
<设计模式其实很简单>笔记
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
//抽象的状态类
public abstract calss State{
public String stateName;
public abstract void Handle(Context context);
}
//具体状态A
public class ConcreteStateA extends State{
public ConcreteStateA(){
stateName = "状态A";
}
//覆盖父类的抽象方法
@Override
public void Handle(Context context){
context.setState(new ConcreteStateB());
}
}
//具体状态B
public class ConcreteStateB extends State{
public ConcreteStateB(){
stateName = "状态B";
}
//覆盖父类的抽象方法
@Override
public void Handle(Context context){
context.setState(new ConcreteStateA());
}
}
//Context类
public class Context{
private State state;
public Context(State state){
this.state = state;
}
//设置状态
public void setState(State state){
System.out.println("当前状态为:" + this.state.state.Name);
this.state = state;
System.out.println("当前变更为:" + this.state.state.Name);
}
public void Request(){
state.Handle(this);
}
}
//客户端
public static void main(String[] args){
Context context = new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
}
③好处:
将与特定状态相关的行为进行局部化,并且将不同状态的行为进行分割。也就是将特定的与状态相关的行为都放进一个对象中,由于所有与状态有关的代码都存在于某个具体的状态类中,所以通过定义新的具体状态类就可以很容易地增加新的状态和转换。
④适用的情况:
当一个对象的行为取决于它的状态并且它必须在运行时刻根据状态来改变自己的行为时
当一个操作中含有大量的多分支的条件语句,并且这些分支都依赖于该对象的状态时