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()