設計模式之狀態模式-State

State狀態設計模式類似於Switch多路分支功能的開關,State狀態模式機制如下:

狀態模式UML圖如下:


State狀態設計模式用於改變對象的行爲,在代理的生命週期裏,隨着狀態變化從一個目標實現程序切換到另一個目標實現程序。

我們經常遇到如下的程序代碼:

  1. public class Creature{  
  2.      private Boolean isFrog = true;//標識  
  3.      public void greet(){  
  4.            if(isForg){  
  5.         System.out.println(“Ribbet!”);  
  6.        }else{  
  7.         System.out.println(“Darling!”);  
  8.        }  
  9.      }  
  10.      //轉換標識  
  11.      public void kiss(){  
  12.     isForg = false;   
  13.      }  
  14.      public static void main(String[] args){  
  15.            Creature creature = new Creature();  
  16.            creature.greet();  
  17.            creature.kiss();  
  18.            creature.greet();  
  19.      }  
  20. }  
上面例子代碼中greet()方法在執行具體操作之前必須要判斷一下標識,代碼顯得笨拙繁瑣,使用簡單State狀態模式改寫上面代碼如下:

  1. public class Creature{  
  2.     //狀態接口  
  3.     private interface State{  
  4.           String response();  
  5.     }  
  6.     private class Forg implements State{  
  7.           public String response(){  
  8.        return “Ribbet!”;  
  9.           }  
  10.     }  
  11.     private class Prince implements State{  
  12.           public String response(){  
  13.        return “Darling!”;  
  14.           }  
  15.     }  
  16.     private State state = new Forg();  
  17.     public void greet(){  
  18.           System.out.println(state.response);  
  19.     }  
  20.     public void kiss(){  
  21.           state = new Prince();  
  22.     }  
  23.     public static void main(String[] args){  
  24.           Creature creature = new Creature();  
  25.           creature.greet();  
  26.           creature.kiss();  
  27.           creature.greet();  
  28.     }   
  29. }  

State狀態設計模式中,狀態自動切換並傳播,不需要再改動標識,代碼顯得非常優雅。

State狀態設計模式一個基本框架如下:

  1. //狀態接口  
  2. interface State{  
  3.     void operation1();  
  4.     void operation2();  
  5.     void operation3();  
  6. }  
  7. //狀態實現類1  
  8. class implementation1 implements State{  
  9.     public void operation1(){  
  10.         System.out.println(“Implementation1.operation1()”);  
  11.     }  
  12.     public void operation2(){  
  13.         System.out.println(“Implementation1.operation2()”);  
  14.     }  
  15.    public void operation3(){  
  16.         System.out.println(“Implementation1.operation3()”);  
  17.     }  
  18. }  
  19. //狀態實現類2  
  20. class implementation2 implements State{  
  21.     public void operation1(){  
  22.         System.out.println(“Implementation2.operation1()”);  
  23.     }  
  24.     public void operation2(){  
  25.         System.out.println(“Implementation2.operation2()”);  
  26.     }  
  27.    public void operation3(){  
  28.         System.out.println(“Implementation2.operation3()”);  
  29.     }  
  30. }  
  31. //服務提供者  
  32. class ServiceProvider{  
  33.     private State state;  
  34.     public ServiceProvider(State state){  
  35.          this.state = state;  
  36.     }  
  37.     //狀態更改  
  38.     public void changeState(State newState){  
  39.          state = newState;  
  40.     }  
  41.     public void service1(){  
  42.           //……  
  43.           state.operation1();  
  44.           //……  
  45.           state.operation3();  
  46.     }  
  47.     public void service2(){  
  48.           //……  
  49.           state.operation1();  
  50.           //……  
  51.           state.operation2();  
  52.     }  
  53.     public void service3(){  
  54.           //……  
  55.           state.operation3();  
  56.           //……  
  57.           state.operation2();  
  58.     }  
  59. }  
  60. public class StateDemo{  
  61.     private ServiceProvider sp = new ServiceProvider(new Implementation1());  
  62.     private void run(ServiceProvider sp){  
  63.          sp.service1();  
  64.          sp.service2();  
  65.          sp.service3();  
  66.     }  
  67.     public static void main(String[] args){  
  68.         StateDemo demo = new StateDemo();  
  69.         demo.run(sp);  
  70.         sp.changeState(new Implementation2());  
  71.         demo.run(sp);  
  72.     }  
  73. }  

State狀態模式和Proxy代理模式都爲客戶端程序提供了一個目標程序代理,真正的目標程序被代理所隱藏,當客戶端程序調用目標程序時,首先將調用請求發送給代理,代理才真正調用目標程序,但是Proxy代理模式和State狀態模式有如下區別:

(1).Proxy代理模式中被調用的目標程序只有一個,而State狀態模式中被調用的目標程序有多個。

(2).Proxy代理模式的目的是控制客戶端對目標程序的訪問,而State狀態模式是爲了根據條件動態改變目標程序。

轉自:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章