State Pattern으로 유튜브 프리미엄을 결제한 상태그렇지 않은 상태를 표현한다.

유튜브 프리미엄을 결제하면, Background에서도 유튜브를 재생할 수 있다.

protocol State {
    /// 홈버튼 클릭
    func playBackground()
    /// 앱아이콘 클릭
    func playForeground()
    /// 비디오 다운로드  클릭
    func videoDownload()
}
class YoutubeApp {
    
    /// 상태 객체
    var youtubePreminumState: State
    
    init(subscribeState: State) {
        self.youtubePreminumState = subscribeState
    }
    
    /// 상태 객체를 구독객체로 변경
    func subscribe() {
        print("\\n [***] 유튜브 프리미엄 구독 시작 상태로 변경됨 ^^ \\n")
        self.youtubePreminumState = SubscribeState()
    }
    
    /// 상태객체를 구독 해제 객체로 변경
    func unSubscribe() {
        print("\\n [***] 유튜브 프리미엄 구독해지 상태로 변경됨 ㅜㅜ \\n")
        self.youtubePreminumState = UnSubscribeState()
    }
    
    /// 홈버튼 클릭
    func clickHomeButton(){
        self.youtubePreminumState.playBackground()
    }
    
    /// 앱 아이콘 클릭
    func clickAppIcon(){
        self.youtubePreminumState.playForeground()
    }
    
    /// 영상 다운로드
    func clickDownload(){
        self.youtubePreminumState.videoDownload()
    }
    
}
class SubscribeState:State {
    func playBackground() {
        print("결제를 해서 백그라운드에서도 재생중")
    }
    func playForeground() {
        print("영상 재생중")
    }
    func videoDownload() {
        print("결제 해서 영상 다운로드 가능")
    }
}
class UnSubscribeState:State {
    func playBackground() {
        print("결제를 안 해서 백그라운드에서도 재생 불가....")
    }
    func playForeground() {
        print("영상 재생 중")
    }
    func videoDownload() {
        print("결제를 안 해서 영상 다운로드 불가...")
    }
}
let youtubeApp = YoutubeApp(subscribeState: UnSubscribeState())

youtubeApp.clickAppIcon()
youtubeApp.clickDownload()
youtubeApp.clickHomeButton()

/// 구독
youtubeApp.subscribe()

youtubeApp.clickAppIcon()
youtubeApp.clickDownload()
youtubeApp.clickHomeButton()

/// 구독해지
youtubeApp.unSubscribe()

youtubeApp.clickAppIcon()
youtubeApp.clickDownload()
youtubeApp.clickHomeButton()

Screen Shot 2022-09-07 at 4.15.40 PM.png