狀態模式

壹頁書發表於2014-03-22
狀態模式的類圖

我覺得在現實生活中,比較典型的狀態模式就是紅綠燈。
  1. public class Test {
  2.     public static void main(String[] args) throws InterruptedException {
  3.         紅綠燈 context = new 紅綠燈();
  4.         context.beginWork();
  5.     }
  6. }

  7. class 紅綠燈 {
  8.     private 指示燈 currentState = new 紅燈();

  9.     public void beginWork() throws InterruptedException {
  10.         currentState.(this);
  11.     }

  12.     public void setCurrentState(指示燈 currentState) {
  13.         this.currentState = currentState;
  14.     }

  15. }

  16. interface 指示燈 {
  17.     void 亮(紅綠燈 context) throws InterruptedException;
  18. }

  19. class 紅燈 implements 指示燈 {

  20.     @Override
  21.     public void 亮(紅綠燈 context) throws InterruptedException {
  22.         System.out.println("紅燈點亮");
  23.         Thread.sleep(3000);
  24.         context.setCurrentState(new 綠燈());
  25.         context.beginWork();
  26.     }

  27. }

  28. class 黃燈 implements 指示燈 {

  29.     @Override
  30.     public void 亮(紅綠燈 context) throws InterruptedException {
  31.         System.out.println("黃燈閃爍");
  32.         Thread.sleep(1000);
  33.         System.out.println("黃燈閃爍");
  34.         Thread.sleep(1000);
  35.         System.out.println("黃燈閃爍");
  36.         Thread.sleep(1000);
  37.         context.setCurrentState(new 紅燈());
  38.         context.beginWork();
  39.     }

  40. }

  41. class 綠燈 implements 指示燈 {

  42.     @Override
  43.     public void 亮(紅綠燈 context) throws InterruptedException {
  44.         System.out.println("綠燈點亮");
  45.         Thread.sleep(4000);
  46.         context.setCurrentState(new 黃燈());
  47.         context.beginWork();
  48.     }

  49. }
結果:
紅燈點亮
綠燈點亮
黃燈閃爍
黃燈閃爍
黃燈閃爍
紅燈點亮
...
...
與責任鏈模式不同的是,狀態模式在狀態執行時,指定下一個狀態的資訊。
而責任鏈模式則在Client裝配責任鏈。
相對來說,狀態模式的狀態轉換是固定的,而責任鏈模式的請求路徑,則可以在Client呼叫時,動態構建。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1127079/,如需轉載,請註明出處,否則將追究法律責任。

相關文章