状态模式基本概念

本身就是个菜鸟,写不出来什么高深的东西,下面就简单的介绍下其的好处

首先我们需要先了解下状态模式的角色

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

举个生活的例子平常我们去写遥控器去控制频道的切换可能会写在同一个类当中

import Foundation

class TvController:NSObject
{
    //开机状态
    private let POWER_ON:Int = 1

    //关机状态
    private let POWER_OFF:Int = 0

    //当前状态
    private var state:Int

    override init() {
        //初始化当前状态为关机状态
        self.state = POWER_OFF
         super.init()
    }

    //开机
    func powerOn()
    {
        self.state = POWER_ON
        print("开机")
    }

    //关机
    func powerOff()
    {
        self.state = POWER_OFF
        print("关机")
    }

    //下一个频道
    func nextChannel()
    {
      if self.state == POWER_ON
      {
        print("下一个频道")
      }else
      {
        print("没有开机")
      }
    }
    //上一个频道
    func preChannel()
    {
        if self.state == POWER_ON
        {
            print("上一个频道")
        }
        else
        {
            print("没有开机")
        }
    }
    //调高音量
    func turnUp() {
        if self.state == POWER_ON {
            print("调高音量")
        } else {
            print("没有开机")
        }
    }

    //调低音量
    func turnDown() {
        if self.state == POWER_ON {
            print("调低音量")
        } else {
            print("没有开机")
        }
    }


}

如果是我们去使用状态模式,就可以根据遥控器控制的开关机的状态来进行进行频道的切换,下面是抽象状态角色,定义一些抽象方法

import Foundation

//抽象状态
protocol StateProtocol
{
    //下一个频道
    func nextChannel()

    //上一个频道
    func preChannel()

    //调高音量
    func turnUp()

    //调低音量
    func turnDown()
}

然后就是开关机的具体状态

import Foundation

//开机
class OnState:StateProtocol
{
    //下一个频道
    func nextChannel() {
        print("下一个频道")
    }

    //上一个频道
    func preChannel() {
        print("上一个频道")
    }

    //调高音量
    func turnUp() {
        print("调高音量")
    }

    //调低音量
    func turnDown() {
        print("调低音量")
    }


}
import Foundation

class OffState:StateProtocol
{
    //下一个频道
    func nextChannel() {
        print("没有开机")
    }

    //上一个频道
    func preChannel() {
        print("没有开机")
    }

    //调高音量
    func turnUp() {
        print("没有开机")
    }

    //调低音量
    func turnDown() {
        print("没有开机")
    }
}

TvControllerContext状态管理器,可以进行状态的切换

import Foundation


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()
    }

    //下一个频道
    func nextChannel() {
        self.state.nextChannel()
    }

    //上一个频道
    func preChannel() {
        self.state.preChannel()
    }

    //调高音量
    func turnUp() {
        self.state.turnUp()
    }
    //调低音量
    func turnDown() {
        self.state.turnDown()
    }


}

我们这样分的好处就是开机和关机状态都需要处理一样的逻辑,这样我们抽象出来做出一个协议,然后这样我们开机状态和关机状态都可以分开决定了,以及在外部我们进行使用也很简单控制下状态,然后直接通过状态管理器去调用方法就可以了,具体使用步骤如下所示

//初始状态为关机状态
let tv = TvControllerContext()

//切换到下一个频道
tv.nextChannel()

//设置为开机状态
tv.powerOn()

//切换到上一个频道
tv.preChannel()

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值