Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(當一個對象內在狀態改變時,允許其改變行爲,這個對象看起來像改變了其類)
狀態模式適應
public abstract class LiftState {
protected Context context;
public void setContext(Context _context){
this.context=_context;
}
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
關閉狀態
public class ClosingState extends LiftState {
@Override
public void close() {
System.out.println("close the lift");
}
@Override
public void open() {
super.context.setLiftState(Context.openningState);
super.context.getLiftState().open();
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.getLiftState().run();
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.getLiftState().stop();
}
}
停止狀態public class StoppingState extends LiftState {
@Override
public void close() {
//do nothing
}
@Override
public void open() {
super.context.setLiftState(Context.openningState);
super.context.getLiftState().open();
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.getLiftState().run();
}
@Override
public void stop() {
System.out.println("the lift is stoped");
}
}
運行狀態public class RunningState extends LiftState {
@Override
public void close() {
//do nothing
}
@Override
public void open() {
//do nothing
}
@Override
public void run() {
System.out.println("lift is runing...");
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.getLiftState().stop();
}
}
開門狀態public class OpenningState extends LiftState {
@Override
public void close() {
super.context.setLiftState(Context.closingState); //調用的是Context中的方法
super.context.getLiftState().close(); //通過Context調用另一個狀態的方法
}
@Override
public void open() {
System.out.println("lift is open...");
}
@Override
public void run() {
//do nothing
}
@Override
public void stop() {
//do nothing
}
}
上下文對象public class Context {
public final static OpenningState openningState=new OpenningState();
public final static ClosingState closingState=new ClosingState();
public final static RunningState runningState=new RunningState();
public final static StoppingState stoppingState=new StoppingState();
private LiftState liftState;
public LiftState getLiftState() {
return liftState;
}
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
this.liftState.setContext(this); //將該狀態設置上下文對象
}
public void close() {
this.liftState.close();
}
public void open() {
this.liftState.open();
}
public void run() {
this.liftState.run();
}
public void stop() {
this.liftState.stop();
}
}
場景測試
public class Client {
public static void main(String[] args) {
Context context=new Context();
context.setLiftState(Context.closingState);
context.open();
context.close();
context.run();
context.stop();
}
}
/*
上下文對象Context,成員屬性LiftState,可設置四種狀態,獲取和改變狀態,相當於一個公共容器
四種狀態的抽象LiftState,成員屬性Context,可設置上下文對象,讓四種狀態都擁有同一個Context
你中有我,我中有你,通過容器Context可以進行狀態的切換,將四者聯合成一體
當狀態改變時,通過父類的統一Context改變了LiftState狀態,然後調用了改變後狀態的方法
也就是說
*/
結果
lift is open...
close the lift
lift is runing...
the lift is stoped
我是菜鳥,我在路上。