依据不同的状态,有着不同的行为。状态之间来回切换,如果新增状态,只需要新增新的状态的类就可以了。将不同状态的判断逻辑放在了各个状态类中了。
这里以过马路的红绿灯状态为例子来说明下。
/**
* 定义状态的接口,包含状态的抽象方法
* @author Administrator
*
*/
public interface State {
// 下个状态
public void lastState(StateManager stateManager);
//上个状态
public void nextState(StateManager stateManager);
//当前状态
public void getState();
}
------------------------------------------------------------------------------
/**
* 红灯状态
* @author Administrator
*
*/
public class RedState implements State{
@Override
public void lastState(StateManager stateManager) {
stateManager.setState(new YellowState());
}
@Override
public void nextState(StateManager stateManager) {
stateManager.setState(new GreenState());
}
@Override
public void getState() {
System.out.println("当前为红灯状态:停止通行,请等待6s------");
}
}
--------------------------------------------------------------------------------
/**
* 绿灯状态
* @author Administrator
*
*/
public class GreenState implements State{
@Override
public void lastState(StateManager stateManager) {
stateManager.setState(new RedState());
}
@Override
public void nextState(StateManager stateManager) {
stateManager.setState(new YellowState());
}
@Override
public void getState() {
System.out.println("当前为绿灯状态:允许通行,请速度通行3s---");
}
}
-----------------------------------------------------------------------------------
/**
* 黄灯状态
* @author Administrator
*
*/
public class YellowState implements State{
@Override
public void lastState(StateManager stateManager) {
stateManager.setState(new GreenState());
}
@Override
public void nextState(StateManager stateManager) {
stateManager.setState(new RedState());
}
@Override
public void getState() {
System.out.println("当前为黄灯状态:急速通行1s-");
}
}
-------------------------------------------------------------------------------------
/**
* 状态的管理类
* @author Administrator
*
*/
public class StateManager {
//初始态为红灯
private State state = new RedState();
public void setState(State state){
this.state = state;
}
public void getState(){
state.getState();
}
public void lastState(){
state.lastState(this);
}
public void nextState(){
state.nextState(this);
}
}
-----------------------------------------------------------------------------------
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
StateManager stateManager = new StateManager();
System.out.println("状态模式开启了:------");
while(true){
try {
//红灯
stateManager.getState();
Thread.sleep(6000);
stateManager.nextState();
//绿灯
stateManager.getState();
Thread.sleep(3000);
stateManager.nextState();
//黄灯
stateManager.getState();
Thread.sleep(1000);
stateManager.nextState();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}