允許一個對象再其內部狀態改變時,改變它的行為。對象看起來似乎修改了它的類。
狀態對象(Objects for States)
考慮一個表示網絡連接的類TCPConnection。一個TCPConnection對象的狀態處於若干不同狀態之一:連接已建立(Established)、正在監聽(Listenling),連接已關閉(Closed)。當一個TCPConnection對象收到其他對象的請求時,它根據自身的當前狀態做出不同的反應。例如,一個Open請求的結果依賴於該連接是處於連接已關閉狀態還是連接已建立狀態。State模式描述了TCPConnection如何在每一種狀態下表現出不同的行為。
以下情況使用State模式:
一個對象的行為取決於它的狀態,並且他必須在運行時刻根據狀態改變它的行為。 一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化。核心思想就是:當對象的狀態改變時,同時改變其行為,很好理解!就拿QQ來說,有幾種狀態,在線、隱身、忙碌等,每個狀態對應不同的操作,而且你的好友也能看到你的狀態,所以,狀態模式就兩點:1、可以通過改變狀態來獲得不同的行為。2、你的好友能同時看到你的變化。看圖:
State類是個狀態類,Context類可以實現切換,我們來看看代碼::
實現代碼:
狀態結構:
package com.xtfggef.dp.state;
/**
* 狀態類的核心類
* 2012-12-1
* @author erqing
*
*/
public class State {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void method1(){
System.out.println(execute the first opt!);
}
public void method2(){
System.out.println(execute the second opt!);
}
}
實現:
package com.xtfggef.dp.state;
/**
* 狀態模式的切換類 2012-12-1
* @author erqing
*
*/
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void method() {
if (state.getValue().equals(state1)) {
state.method1();
} else if (state.getValue().equals(state2)) {
state.method2();
}
}
}
測試類:
public class Test {
public static void main(String[] args) {
State state = new State();
Context context = new Context(state);
//設置第一種狀態
state.setValue(state1);
context.method();
//設置第二種狀態
state.setValue(state2);
context.method();
}
}
“`
輸出:
execute the first opt!
execute the second opt!
根據這個特性,狀態模式在日常開發中用的挺多的,尤其是做網站的時候,我們有時希望根據對象的某一屬性,區別開他們的一些功能,比如說簡單的權限控制等。