스테이트 (State) 디자인패턴

스테이트(State) 패턴은 객체의 상태에 따라 행위를 다르게 구현하는 패턴입니다. 이 패턴은 객체가 여러 상태를 가지고 있고, 상태에 따라 객체의 동작이 바뀌어야 하는 경우에 유용하게 사용됩니다.

스테이트 패턴을 예제와 함께 설명해보겠습니다. 예를 들어, iOS 앱에서 사용자의 인증 상태에 따라 화면의 표시가 달라지는 기능을 구현한다고 가정해봅시다. 이때 인증 상태는 로그인 되어 있거나 로그인 되어 있지 않은 상태가 있습니다. 이를 스테이트 패턴으로 구현해보겠습니다.

다음은 스테이트 패턴을 사용하여 인증 상태에 따라 화면을 표시하는 예제 코드입니다.

// 상태 프로토콜
protocol AuthenticationState {
    func showView() -> String
}

// 로그인 되어 있지 않은 상태
class NotLoggedInState: AuthenticationState {
    func showView() -> String {
        return "로그인 해주세요."
    }
}

// 로그인 되어 있는 상태
class LoggedInState: AuthenticationState {
    func showView() -> String {
        return "환영합니다."
    }
}

// 상태 관리 클래스
class AuthenticationManager {
    var state: AuthenticationState

    init(state: AuthenticationState) {
        self.state = state
    }

    func showView() -> String {
        return state.showView()
    }
}

// 사용 예제
let notLoggedInState = NotLoggedInState()
let loggedInState = LoggedInState()

let authenticationManager = AuthenticationManager(state: notLoggedInState)
print(authenticationManager.showView())   // "로그인 해주세요."

authenticationManager.state = loggedInState
print(authenticationManager.showView())   // "환영합니다."

위의 예제에서는 AuthenticationState 프로토콜을 정의하고, NotLoggedInState 클래스와 LoggedInState 클래스를 구현합니다. AuthenticationManager 클래스는 AuthenticationState 프로토콜을 준수하는 state 프로퍼티를 가지고 있습니다. AuthenticationManager 클래스의 showView 메서드에서는 현재 상태에 따라 화면을 표시합니다.

스테이트 패턴을 사용하면, 객체의 상태에 따라 행동을 다르게 구현할 수 있습니다. 이를 통해 객체 간의 결합도를 낮추어 유지보수성을 향상시킬 수 있으며, 확장성과 유연성을 제공할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다