2 典型實現
3 例項
4 共享狀態
5 環境類實現狀態切換
6 主要優點
7 主要缺點
8 適用場景
9 總結
狀態模式用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題。當系統中的某個物件存在多個狀態,這些狀態之間可以進行轉換,而且物件在不同狀態下行為不相同時可以使用狀態模式。
狀態模式將乙個物件的狀態從該物件中分離出來,封裝到專門的狀態類中,使得物件狀態可以靈活變化,對於客戶端而言,無須關心物件狀態的轉換以及物件所處的當前狀態,無論對於何處狀態物件,客戶端都可以一致性地處理。
狀態模式:允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎是修改了它的類。
狀態模式是一種物件行為型模式。
}具有預設初始化狀態,可以通過setter修改狀態,request
為環境類業務方法,其中呼叫了抽象狀態類的狀態處理方法。
inte***ce
state
這裡設計為介面,使用環境類作為引數。
class
concretestate1
implements
state
}class
concretestate2
implements
state
}
兩個具體狀態類,執行完具體狀態類裡面的**後,通過環境類引數將環境類切換到另乙個狀態。
public
static
void
main
(string[
] args)
客戶端直接呼叫環境類業務方法,輸出如下:
設計乙個銀行賬戶,賬戶允許不同的狀態,餘額大於0處於正常狀態,餘額大於-2000小於0處於透支狀態,餘額小於等於-2000處理受限狀態。根據餘額不同狀態可發生轉換,使用狀態模式進行設計。設計如下:
首先是環境類:
class
account
public
void
deposit
(double amount)
public
void
withdraw
(double amount)
public
double
getbalance()
@override
public string tostring()
}
初始化為正常狀態,餘額為0,在存款/取款中呼叫抽象狀態類的狀態檢查方法,也就是狀態轉換交由狀態類處理。
接著是抽象狀態類:
abstract
class
state
擁有乙個環境類的引用,以便使用環境類的setstate
改變狀態方法。
最後是具體狀態類:
class
normalstate
extends
state
@override
public
void
check()
@override
public string tostring()
}class
overdraftstate
extends
state
@override
public
void
check()
@override
public string tostring()
}class
restrictedstate
extends
state
@override
public
void
check()
@override
public string tostring()
}
三個具體狀態類分別表示三種不同狀態,在其中的check
方法中進行狀態檢查以及切換狀態。
測試:
public
static
void
main
(string[
] args)
客戶端不需要理會具體狀態,按正常流程操作即可,下面是輸出:
有時候多個環境物件可能需要共享同乙個狀態,這時需要將狀態物件定義為環境類的靜態成員,例子如下:
某個系統要求兩個開關物件必須處於一樣的狀態,要麼同時關,要麼同時開,開關可以自由切換狀態,使用狀態模式進行設計。設計如下:
環境類:
class
switch
public
switch
(string name)
public string getname()
public
void
setstate
(state state)
public
static state getonstate()
public
static state getoffstate()
public
voidon(
)public
void
off(
)}
環境類初始化兩個靜態的開與關狀態,在on
以及off
中呼叫狀態方法。
抽象狀態:
inte***ce
state
具體狀態:
class
onstate
implements
state
@override
public
void
off(switch s)
}class
offstate
implements
state
@override
public
void
off(switch s)
}
實現抽象狀態的開關方法,處於關狀態時呼叫on
會切換到開狀態,呼叫off
則不處理,處於開狀態同理。
測試:
public
static
void
main
(string[
] args)
在上面的例子中,都是通過具體狀態類進行狀態切換,比如:
class
restrictedstate
extends
state
}
class
onstate
implements
state
}
狀態切換也可以由環境類進行統一處理,但是如果增加新的狀態類可能需要修改環境類**。例子如下:
設計乙個放大鏡工具,單擊一次放大一倍,單擊兩次再放大一杯,第三次就恢復預設大小,使用狀態模式進行設計。設計如下:
環境類:
class
screen
public
screen()
public
void
onclick()
}
首先初始化各個狀態,然後在onclick()
中由環境類控制狀態切換。
狀態類:
inte***ce
state
class
normalstate
implements
state
}class
largerstate
implements
state
}class
largeststate
implements
state
}
測試:
設計模式觀後(c 還原之二十三 狀態模式)
狀態模式 首先作者舉例是電梯的公升降和操作 上公升狀態的關門 開門 運動等動作判斷 下降狀態的動作判斷 我第一次想到的是 用四個列舉來表示當前電梯狀態,然後動作函式的執行用switch 狀態 case 執行 來寫。來看作者的寫法吧 class context 後面的上下文類 class openni...
設計模式 二十三 模板方法模式
template method pattern 模板方法模式 template method pattern 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法模式是一種基於繼承的 復用技術,它是一種類行為型...
設計模式(二十三) 職責鏈模式
一 以加薪 為例 加薪 初步 class request public void setnumber int number public string getrequesttype public void setrequesttype string requesttype public string...