狀態(tài)模式

狀態(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)模式UML.png

案例代碼

角色一: 抽象狀態(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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容