protocol State : class {
func update(context: Context)
func handle1()
func handle2()
}
class Context {
private var state: State
init(_ state: State) {
self.state = state
change(state)
}
func change(_ state: State) {
self.state = state
self.state.update(context: self)
}
func request1() {
state.handle1()
}
func request2() {
state.handle2()
}
}
class ConcreteStateA : State {
private(set) weak var context: Context?
func update(context: Context) {
self.context = context
}
func handle1() {
print("ConcreteStateA handles request1.")
context?.changeState(state: ConcreteStateB())
}
func handle2() {
print("ConcreteStateA handles request2.\\n")
}
}
class ConcreteStateB : State {
private(set) weak var context: Context?
func update(context: Context) {
self.context = context
}
func handle1() {
print("ConcreteStateB handles request1.\\n")
}
func handle2() {
print("ConcreteStateB handles request2.")
context?.changeState(state: ConcreteStateA())
}
}
let context = Context(ConcreteStateA())
context.request1() // ConcreteStateA handles request1.
context.request1() // ConcreteStateB handles request1.
context.request2() // ConcreteStateB handles request2.
context.request2() // ConcreteStateA handles request2.