狀態(tài)模式定義:
Swift、OC開(kāi)發(fā)中,狀態(tài)模式不多,服務(wù)器開(kāi)發(fā)里面、Android移動(dòng)端系統(tǒng)源碼有的->Wifi管理就是采用狀態(tài)模式
第一點(diǎn):當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)候允許改變其行為狀態(tài):類似于Wifi狀態(tài)行為:影響手機(jī)數(shù)據(jù)傳輸(特定一些功能)
第二點(diǎn):這個(gè)對(duì)象看起來(lái)像是改變了類不同的狀態(tài),調(diào)用(執(zhí)行)相同功能,最終的效果不一樣
狀態(tài)模式-應(yīng)用場(chǎng)景
場(chǎng)景一:一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變它的行為。
場(chǎng)景二:程序代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語(yǔ)句。if-else語(yǔ)句->Swift案例->結(jié)構(gòu)
注:狀態(tài)模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類中,這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化,這樣通過(guò)多態(tài)來(lái)去除過(guò)多的、重要復(fù)雜的if-else等分支語(yǔ)句。
狀態(tài)模式-角色劃分?
角色一:抽象狀態(tài)->StateProtocol
角色二:具體狀態(tài)->ConcrateState
角色三:狀態(tài)管理器(上下文)->Context
狀態(tài)模式-UML類圖

案例代碼
角色一: 抽象狀態(tài)代碼
protocol StateProtocol {
//下一個(gè)頻道
func nextChannel()
//上一個(gè)頻道
func preChannel()
//跳高音量
func turnUp()
//跳低音量
func turnDown()
}
角色二: 具體狀態(tài) 開(kāi)機(jī)狀態(tài)
//開(kāi)機(jī)
class OnState: StateProtocol {
//下一個(gè)頻道
func nextChannel() {
print("下一個(gè)頻道")
}
//上一個(gè)頻道
func preChannel() {
print("下一個(gè)頻道")
}
//跳高音量
func turnUp() {
print("跳高音量")
}
//跳低音量
func turnDown() {
print("跳低音量")
}
}
角色二:具體狀態(tài),關(guān)機(jī)狀態(tài)
class OffState: StateProtocol {
//下一個(gè)頻道
func nextChannel() {
print("沒(méi)有開(kāi)機(jī)")
}
//上一個(gè)頻道
func preChannel() {
print("沒(méi)有開(kāi)機(jī)")
}
//跳高音量
func turnUp() {
print("沒(méi)有開(kāi)機(jī)")
}
//跳低音量
func turnDown() {
print("沒(méi)有開(kāi)機(jī)")
}
}
角色三: 狀態(tài)管理器(上下文)
class TvControllerContext: NSObject, StateProtocol {
//當(dāng)前狀態(tài)
private var state:StateProtocol
override init() {
self.state = OffState()
super.init()
}
//開(kāi)機(jī)
func powerOn() {
self.state = OnState()
print("開(kāi)啟啦")
}
//關(guān)機(jī)
func powerOff() {
self.state = OffState()
print("關(guān)機(jī)啦")
}
//下一個(gè)頻道
func nextChannel() {
self.state.nextChannel()
}
//上一個(gè)頻道
func preChannel() {
self.state.preChannel()
}
//跳高音量
func turnUp() {
self.state.turnUp()
}
//跳低音量
func turnDown() {
self.state.turnDown()
}
}
外部調(diào)用:
let tvController = TvControllerContext()
tvController.powerOn()
tvController.nextChannel()