本身就是个菜鸟,写不出来什么高深的东西,下面就简单的介绍下其的好处
首先我们需要先了解下状态模式的角色
- 角色一:抽象状态->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()