美文网首页
状态模式

状态模式

作者: 一毛钱 | 来源:发表于2019-03-24 18:05 被阅读0次

    状态模式定义:

    Swift、OC开发中,状态模式不多,服务器开发里面、Android移动端系统源码有的->Wifi管理就是采用状态模式
    第一点:当一个对象的内在状态改变时候允许改变其行为状态:类似于Wifi状态行为:影响手机数据传输(特定一些功能)
    第二点:这个对象看起来像是改变了类不同的状态,调用(执行)相同功能,最终的效果不一样

    状态模式-应用场景

    场景一:一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
    场景二:程序代码中包含大量与对象状态有关的条件语句。if-else语句->Swift案例->结构
    注:状态模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化,这样通过多态来去除过多的、重要复杂的if-else等分支语句。

    状态模式-角色划分?

    角色一:抽象状态->StateProtocol
    角色二:具体状态->ConcrateState
    角色三:状态管理器(上下文)->Context

    状态模式-UML类图

    状态模式UML.png

    案例代码

    角色一: 抽象状态代码

    protocol StateProtocol {
        //下一个频道
        func nextChannel()
        
        //上一个频道
        func preChannel()
        
        //跳高音量
        func turnUp()
        
        //跳低音量
        func turnDown()
    }
    

    角色二: 具体状态 开机状态

    //开机
    class OnState: StateProtocol {
    
        //下一个频道
        func nextChannel() {
            print("下一个频道")
        }
        
        //上一个频道
        func preChannel() {
            print("下一个频道")
        }
        
        //跳高音量
        func turnUp() {
            print("跳高音量")
        }
        
        //跳低音量
        func turnDown() {
            print("跳低音量")
        }
        
    }
    

    角色二:具体状态,关机状态

    class OffState: StateProtocol {
    
        //下一个频道
        func nextChannel() {
            print("没有开机")
        }
        
        //上一个频道
        func preChannel() {
            print("没有开机")
        }
        
        //跳高音量
        func turnUp() {
            print("没有开机")
        }
        
        //跳低音量
        func turnDown() {
            print("没有开机")
        }
        
    }
    

    角色三: 状态管理器(上下文)

    class TvControllerContext: NSObject, StateProtocol {
        //当前状态
        private var state:StateProtocol
        
        override init() {
            self.state = OffState()
            super.init()
        }
        
        //开机
        func powerOn() {
            self.state = OnState()
            print("开启啦")
        }
        
        //关机
        func powerOff() {
            self.state = OffState()
            print("关机啦")
        }
        
        //下一个频道
        func nextChannel() {
            self.state.nextChannel()
        }
        
        //上一个频道
        func preChannel() {
            self.state.preChannel()
        }
        
        //跳高音量
        func turnUp() {
            self.state.turnUp()
        }
        
        //跳低音量
        func turnDown() {
            self.state.turnDown()
        }
        
    }
    
    

    外部调用:

     let tvController = TvControllerContext()
     tvController.powerOn()
     tvController.nextChannel()
    

    相关文章

      网友评论

          本文标题:状态模式

          本文链接:https://www.haomeiwen.com/subject/pwbyvqtx.html