设计模式之——状态(State)模式
状态模式定义
允许一个对象在其内部状态改变时改变它的行为
状态模式的优点
- 减少对象间的相互依赖。
- 有利于程序的扩展。
状态模式的缺点
- 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
- 状态模式的使用会增加系统的类与对象的个数。
状态模式的实现
定义一个环境类
/**
* @ClassName Enviroment
* @Description TODO
* @Author mamingcong
* @Date 2020/6/19 18:43
* @Version 1.0
*/
public class Enviroment {
private AbstractState abstractState;
public Enviroment(AbstractState abstractState) {
this.abstractState = abstractState;
}
public AbstractState getAbstractState() {
return abstractState;
}
public void setAbstractState(AbstractState abstractState) {
this.abstractState = abstractState;
}
public void doSth(){
abstractState.doSth(this);
}
}
定义一个抽象状态类
/**
* @ClassName AbstractState
* @Description TODO
* @Author mamingcong
* @Date 2020/6/19 18:42
* @Version 1.0
*/
public abstract class AbstractState {
public abstract void doSth(Enviroment enviroment);
}
定义两个具体的类
/**
* @ClassName RealState2
* @Description TODO
* @Author mamingcong
* @Date 2020/6/19 18:48
* @Version 1.0
*/
public class RealState2 extends AbstractState{
@Override
public void doSth(Enviroment enviroment) {
System.out.println("当前状态是RealState2");
enviroment.setAbstractState(new RealState());
}
}
/**
* @ClassName RealState
* @Description TODO
* @Author mamingcong
* @Date 2020/6/19 18:46
* @Version 1.0
*/
public class RealState extends AbstractState{
@Override
public void doSth(Enviroment enviroment) {
System.out.println("当前状态是RealState");
enviroment.setAbstractState(new RealState2());
}
}
测试
/**
* @ClassName Test
* @Description TODO
* @Author mamingcong
* @Date 2020/6/20 0:02
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
AbstractState abstractState = new RealState();
Enviroment enviroment = new Enviroment(abstractState);
enviroment.doSth();
enviroment.doSth();
enviroment.doSth();
enviroment.doSth();
}
}
运行结果
当前状态是RealState
当前状态是RealState2
当前状态是RealState
当前状态是RealState2
状态模式的使用场景
- 当一个对象的行为取决于它的状态,必须在运行时根据状态改变它的行为时。