一、狀態模式:改變對象的行爲web
一個用來改變類的(狀態的)對象。設計模式
2:問題:當你本身實現 State 模式的時候就會碰到不少細節的問題,你必須根據本身的須要選擇合適的實現方法,ide
好比用到的狀態(State)是否要暴露給調用的客戶,以及如何使狀態發生變化spa
用於改變狀態的機制可能很簡單也可能很複雜-好比狀態機(State Machine)設計
三、代理(Proxy)設計模式其實是狀態設計模式的一個特例代理
四、和策略模式Strategy的區別和聯繫(本段轉載自:http://joe5456536.blog.163.com/blog/static/85374773201192252829941/)code
狀態模式和策略模式的結構師徹底同樣的,但它們的目的、實現、本質卻徹底不同。orm
狀態模式的行爲是平行的,不可相互替換的;對象
而策略模式的行爲是平等性的,是能夠相互替換的。blog
五、類圖以及UML(astah/jude)下載地址 :http://pan.baidu.com/s/1kTieTa3
六、示例:
通用狀態規範
1 package com.xinye.test.state; 2 /** 3 * 全部的狀態都具備的行爲規範 4 * @author xinye 5 * 6 */ 7 public interface IState { 8 public void operator(); 9 }
第一種狀態
1 package com.xinye.test.state; 2 3 /** 4 * 第一種狀態 5 * @author xinye 6 * 7 */ 8 public class FirstState implements IState { 9 10 @Override 11 public void operator() { 12 System.out.println(getClass().getSimpleName() + " operator()"); 13 } 14 15 }
第二種狀態
package com.xinye.test.state; /** * 第二種狀態 * @author xinye * */ public class SecondState implements IState { @Override public void operator() { System.out.println(getClass().getSimpleName() + " operator()"); } }
第三種狀態
1 package com.xinye.test.state; 2 3 /** 4 * 第三種狀態 5 * @author xinye 6 * 7 */ 8 public class ThirdState implements IState { 9 10 @Override 11 public void operator() { 12 System.out.println(getClass().getSimpleName() + " operator()"); 13 } 14 15 }
狀態模式Context(執行具體的方法的時候,須要傳遞相應的狀態代碼,我的感受最好能定義出來一個Enum來規範)
1 package com.xinye.test.state; 2 /** 3 * 狀態上下文 4 * @author xinye 5 * 6 */ 7 public class Context { 8 9 private IState state = null; 10 /** 11 * 執行操做 12 * @param _state 哪種狀態 13 */ 14 public void exec(int _state){ 15 if(1 == _state){ 16 state = new FirstState(); 17 }else if(2 == _state){ 18 state = new SecondState(); 19 }else{ 20 state = new ThirdState(); 21 } 22 state.operator(); 23 } 24 }
客戶端代碼
1 package com.xinye.test.state; 2 /** 3 * 客戶端代碼 4 * @author xinye 5 * 6 */ 7 public class Client { 8 public static void main(String[] args) { 9 Context context = new Context(); 10 11 context.exec(1); 12 context.exec(2); 13 context.exec(3); 14 } 15 }
執行結果:
FirstState operator()
SecondState operator()
ThirdState operator()
-------------------------------------------------------------------------------------------
另外一種Context和Client
1 package com.xinye.test.state; 2 /** 3 * 第二種狀態模式的實現 4 * @author xinye 5 * 6 */ 7 public class Context_2 { 8 private IState state = new FirstState(); 9 10 public void exec(){ 11 state.operator(); 12 // 其餘代碼 13 // *** 14 changeState(); 15 16 } 17 private void changeState(){ 18 if(state instanceof FirstState){ 19 state = new SecondState(); 20 }else if(state instanceof SecondState){ 21 state = new ThirdState(); 22 }else{ 23 state = new FirstState(); 24 } 25 } 26 } 27 28 package com.xinye.test.state; 29 30 public class Client_2 { 31 public static void main(String[] args) { 32 Context_2 context2 = new Context_2(); 33 context2.exec(); 34 context2.exec(); 35 context2.exec(); 36 context2.exec(); 37 context2.exec(); 38 } 39 }
執行結果:
FirstState operator()SecondState operator()ThirdState operator()FirstState operator()SecondState operator()