設計模式_狀態模式

State Pattern

    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

我是菜鳥,我在路上。
發佈了78 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章