State狀態設計模式

一、狀態模式:改變對象的行爲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()

相關文章
相關標籤/搜索