意圖
允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它的類。
結(jié)構(gòu)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-858474.html
- Context(上下文)定義客戶感興趣的接口;維護(hù)一個(gè)ConcreteState子類的實(shí)例,這個(gè)實(shí)例定義當(dāng)前狀態(tài)。
- State(狀態(tài))定義一個(gè)接口以封裝與Context的一個(gè)特定狀態(tài)相關(guān)的行為。
- ConcreteState(具體狀態(tài)子類)每個(gè)子類實(shí)現(xiàn)與Context的一個(gè)狀態(tài)相關(guān)的行為。
- Handle是一個(gè)代表處理當(dāng)前狀態(tài)的動(dòng)作或方法的命名。在狀態(tài)模式中,每個(gè)具體狀態(tài)子類都會(huì)實(shí)現(xiàn)自己的 handle 方法,用來(lái)定義該狀態(tài)下的具體行為或邏輯。當(dāng)上下文調(diào)用 handle 方法時(shí),實(shí)際執(zhí)行的是當(dāng)前狀態(tài)對(duì)應(yīng)的具體狀態(tài)子類中的 handle 方法。
適用性
- 一個(gè)對(duì)象的行為決定于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為。
- 一個(gè)操作中含有龐大的多分支條件語(yǔ)句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)常用一個(gè)或多個(gè)枚舉常量表示。通常,有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類中。這使得開(kāi)發(fā)者可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這個(gè)對(duì)象可以不依賴于其他對(duì)象獨(dú)立變化。
代碼示例
// 狀態(tài)接口
interface State {
void handle();
}
// 具體狀態(tài)子類A
class ConcreteStateA implements State {
@Override
public void handle() {
System.out.println("Handling state A");
}
}
// 具體狀態(tài)子類B
class ConcreteStateB implements State {
@Override
public void handle() {
System.out.println("Handling state B");
}
}
// 上下文類
class Context {
private State currentState;
public Context() {
// 初始狀態(tài)為A
currentState = new ConcreteStateA();
}
public void setState(State state) {
this.currentState = state;
}
public void request() {
currentState.handle();
}
}
// 測(cè)試
public class StatePatternExample {
public static void main(String[] args) {
Context context = new Context();
// 初始狀態(tài)為A
context.request();
// 改變狀態(tài)為B
context.setState(new ConcreteStateB());
context.request();
}
}
在這個(gè)示例中,State接口定義了狀態(tài)的行為,ConcreteStateA和ConcreteStateB是具體狀態(tài)子類,分別實(shí)現(xiàn)了不同狀態(tài)下的行為。Context類維護(hù)了一個(gè)當(dāng)前狀態(tài)的實(shí)例,根據(jù)當(dāng)前狀態(tài)來(lái)調(diào)用相應(yīng)的行為。在測(cè)試中,創(chuàng)建了一個(gè)Context對(duì)象并初始化為狀態(tài)A,然后改變狀態(tài)為B并調(diào)用請(qǐng)求方法,觀察輸出結(jié)果。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858474.html
到了這里,關(guān)于3.8設(shè)計(jì)模式——State 狀態(tài)模式(行為型)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!