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.