Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时容许其改变行为,这个对象看起来像改变了其类。)app
已开门状态和关门状态举例:ide
Context类:this
public class DoorContext { public static final DoorState OPEN_STATE = new OpenState(); public static final DoorState CLOSE_STATE = new CloseState(); /** * 当前状态 */ private DoorState currentState; /** * 得到当前状态 */ public DoorState getCurrentState() { return currentState; } public void setCurrentState(DoorState doorState) { doorState.setDoorContext(this); this.currentState = doorState; } public void close() { this.currentState.close(); } public void open() { this.currentState.open(); } public void enter() { this.currentState.enter(); } public void out() { this.currentState.out(); } public void knock() { this.currentState.knock(); } }
State抽象类:code
public abstract class DoorState { protected DoorContext doorContext; public void setDoorContext(DoorContext _Door_context) { this.doorContext = _Door_context; } public abstract void open(); public abstract void close(); public abstract void enter(); public abstract void out(); public abstract void knock(); }
关门状态实现类:对象
@Override public void open() { System.out.println("开门"); //切换状态 super.doorContext.setCurrentState(DoorContext.OPEN_STATE); } @Override public void close() { System.out.println("已关门"); } @Override public void knock() { System.out.println("关着的门用力敲"); } @Override public void enter() { throw new RuntimeException("门关了,进门失败"); } @Override public void out() { throw new RuntimeException("门关了,出门失败"); }
开门状态实现类:blog
public class OpenState extends DoorState { @Override public void enter() { System.out.println("进入"); } @Override public void out() { System.out.println("出来"); } @Override public void knock() { System.out.println("开着的门轻轻敲"); } @Override public void open() { System.out.println("门已经开着了"); } /** * 涉及到切换到其余状态 */ @Override public void close() { System.out.println("关门"); super.doorContext.setCurrentState(DoorContext.CLOSE_STATE); } }
场景类1:接口
public static void main(String[] args) { DoorContext doorContext = new DoorContext(); //给个初始状态 doorContext.setCurrentState(DoorContext.CLOSE_STATE); //敲门 doorContext.knock(); //开门 doorContext.open(); //进门 doorContext.enter(); //关门 doorContext.close(); //进门 doorContext.open(); //出门 doorContext.out(); //关门 doorContext.close(); }
观察场景类能够知道,当场景类调用的时候,根本不须要在乎状态,只须要关注须要实现的行为,而具体能不能实现行为,具体怎么实现这个行为,状态的流转,则被封装在了Context里。get