State Pattern ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๊ฐ์ฒด์ ๋์๋ ๋ณ๊ฒฝ๋ ์ ์๋๋ก ํ๋ ๋์ ๋์์ธ ํจํด์ ํ ์ข
๋ฅ ์
๋๋ค.
์๋ฅผ ๋ค์๋ฉด, ์ปดํจํฐ๊ฐ ์ผ์ ธ์๋ ์ํฉ์์๋ ์ ์ ๋ฒํผ์ ์ญํ ์ off, ๊บผ์ ธ์๋ ์ํฉ์์๋ on ์ด๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ์ ์ํ์ ๋ฐ๋ผ ๋์(๋ฉ์๋)์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ด๋ค!
Context - ํ์ฌ ์ํ๋ฅผ ๊ฐ๊ณ ์๊ณ ๋์์ด ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด, Protocol ์ ๋คํ์ฑ ํน์ง์ ํตํด ๋์์ ๋ณ๊ฒฝ
State - ๋ชจ๋ ์ํ์ ๋ํ ๋์, ํ์ํ Method ์ Property ๋ฅผ ์ ์ ( Protocol )
Concrete State - State Protocol ์ ์ฑํ, Context ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ๊ตฌํ
- ๋ฐํ์ ์์ ์์ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด์, ๋์์ด ๋ฐ๋ ๋
- ๊ฐ์ฒด์ ์ํ์ ๋ฐ๋ผ ๋์์ ๋ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ง์์ง ๋
์ํ์ ๋ํ ๋์
๊ตฌ๋ ์ด ๋์ด์๋์ง? โ ์์ ์ฌ์, ๋ค์ด๋ก๋ ๋ถ๊ฐ Basic, Standard, Premium ์๊ธ์ ์ํ โ ์์ ์ฌ์, ๋ค์ด๋ก๋ ๊ฐ๋ฅ, ์๊ธ์ ์ ๋ฐ๋ฅธ ํด์๋ ์ฐจ๋ฑ
class NetFlixApp {
private var isSubscribed: Bool
private var isBasic: Bool
private var isStandard: Bool
private var isPremium: Bool
init(isSubscribed: Bool, isBasic: Bool, isStandard: Bool, isPremium: Bool) {
self.isSubscribed = isSubscribed
self.isBasic = isBasic
self.isStandard = isStandard
self.isPremium = isPremium
}
func changePremiumMembership() {
self.isBasic = false
self.isStandard = false
self.isPremium = true
}
func playMovie() {
if !isSubscribed {
print("๊ตฌ๋
X, ์์ ์ฌ์ X")
} else if isSubscribed && isBasic {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 720P")
} else if isSubscribed && isStandard {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1080P")
} else if isSubscribed && isPremium {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1440P")
}
}
func downMovie() {
if !isSubscribed {
print("๊ตฌ๋
X, ์์ ๋ค์ด X")
} else {
print("๊ตฌ๋
O, ์์ ๋ค์ด O")
}
}
}
let netflixApp = NetFlixApp(isSubscribed: true, isBasic: true, isStandard: false, isPremium: false)
netflixApp.playMovie()
netflixApp.downMovie()
netflixApp.changePremiumMembership()
netflixApp.playMovie()
netflixApp.downMovie()
- ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ด ์๋๋ค
- ์ํ์ ๋ฐ๋ฅธ ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ๋์ด๋์ด ์์ด ์ง๊ด์ ์ผ๋ก ํ์ ํ๊ธฐ ์ด๋ ค์
- ์ํ๋ฅผ ๋ฐ๊พธ๋ ๋ถ๋ถ์ด ๋ ธ์ถ๋์ด ์์
- ์๋ก์ด ์ํ๊ฐ ์๊ธด๋ค๋ฉด ๋ชจ๋ ๋ถ๋ถ์ ์์ด์ ์์ ์ด ํ์
enum MembershipType {
case unsubscribed
case basic
case standard
case premium
func play() {
switch self {
case .unsubscribed:
print("๊ตฌ๋
X, ์์ ์ฌ์ X")
case .basic:
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 720P")
case .standard:
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1080P")
case .premium:
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1440P")
}
}
func download() {
switch self {
case .unsubscribed:
print("๊ตฌ๋
X, ์์ ๋ค์ด X")
case .basic, .standard, .premium:
print("๊ตฌ๋
O, ์์ ๋ค์ด O")
}
}
}
class NetFlixApp {
var membership: MembershipType
init(membership: MembershipType) {
self.membership = membership
}
func changeMembership() {
self.membership = .premium
}
func playMovie() {
membership.play()
}
func downMovie() {
membership.download()
}
}
let netflixApp = NetFlixApp(membership: .unsubscribed)
netflixApp.playMovie()
netflixApp.downMovie()
netflixApp.changeMembership()
netflixApp.playMovie()
netflixApp.downMovie()
- enum ์ผ๋ก ๋ชจ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ข์๋ณด์ด์ง๋ง ์ฌ์ ํ ๋ถ๊ธฐ์ฒ๋ฆฌ ํ์
- ์ํ๊ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ, ๊ธฐ๋ฅ ์์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ ์ ์ฉ์ดํ์ง ์๋ค
- OCP ๊ฐ๋ฐฉ ํ์ ์์น์ ์ค์ํ์ง ๋ชปํจ ( ํ์ฅ์๋ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค )
// State
protocol State {
func play()
func download()
}
// ConcreteState
class unSubscribeState: State {
func play() {
print("๊ตฌ๋
X, ์์ ์ฌ์ X")
}
func download() {
print("๊ตฌ๋
X, ์์ ๋ค์ด X")
}
}
class BasicState: State {
func play() {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 720P")
}
func download() {
print("๊ตฌ๋
O, ์์ ๋ค์ด O, 720P")
}
}
class StandardState: State {
func play() {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1080P")
}
func download() {
print("๊ตฌ๋
O, ์์ ๋ค์ด O, 1080P")
}
}
class PremiumState: State {
func play() {
print("๊ตฌ๋
O, ์์ ์ฌ์ O, 1440P")
}
func download() {
print("๊ตฌ๋
O, ์์ ๋ค์ด O, 1440P")
}
}
// Context
class NetFlixApp {
var membership: State
init(membership: State) {
self.membership = membership
}
func changeMembership() {
self.membership = PremiumState()
}
func playMovie() {
membership.play()
}
func downMovie() {
membership.download()
}
}
var myNetFlixApp = NetFlixApp(membership: unSubscribeState())
myNetFlixApp.playMovie()
myNetFlixApp.downMovie()
myNetFlixApp.changeMembership()
myNetFlixApp.playMovie()
myNetFlixApp.downMovie()
- ์ํ์ ๋ฐ๋ฅธ ๋์์ ๊ฐ๋ณ ๊ฐ์ฒด๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ โ ๋ณต์ก๋ ๊ฐ์, ์์ง๋ ํฅ์
- ๋จ์ผ ์ฑ ์ ์์น ์ค์ ( ๊ฐ ์ํ์ ๊ดํ ๋์ ๋ถ๋ฆฌ )
- ๊ฐ๋ฐฉ ํ์ ์์น ์ค์ ( ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ์ํ๋ฅผ ์ถ๊ฐ ํ ์ ์์ )
- ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๊ด๋ฆฌํด์ผํ ํด๋์ค ์ฆ๊ฐ
- ๊ฐ์ฒด๊ฐ ๊ฐ๊ณ ์๋ ์ํ์ ์๊ฐ ์ ๋ค๋ฉด ํจํด์ ์ ์ฉํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์์
- ๋ ํจํด ๋ชจ๋ ๋์์ ์บก์ํํ์ง๋ง ์๋๊ฐ ๋ค๋ฅด๋ค.
- ์ ๋ต ํจํด์ ๋ฐํ์์ ํน์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๋ ๋ฐ ์ค์ ์ ๋๋ ๋ฐ๋ฉด, ์ํ ํจํด์ ๊ฐ์ฒด์ ์ํ ๊ฐ ์ ํ์ ์ฒ๋ฆฌํ๋ค.
๐ก ๋ทํ๋ฆญ์ค ๊ธฐ๋ฅ ์ค ๊ณต์ ํ๊ธฐ๊ฐ ์๊ฒผ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค!
- ๊ณผ์ฐ Enum ๋ฐฉ์์ด ๋์ ๊ฒ์ธ๊ฐ..? ๋ผ๋ ๊ณ ๋ฏผ
- Concrete State ๊ฐ ๋ง๊ณ State ์ ๋์ ๋ฉ์๋๊ฐ ์ ์ ๊ฒฝ์ฐ ์์ ํ Class ๊ฐ ๋ง์์ง๋คโฆ
- ๋จ์ผ ์ฑ ์ ์์น์ ์ค์ํ ์ ์๋คโฆ.
- ์์ ํ ํ์ผ์ด ๋๋ ์ ธ ์์ง ์๊ณ ์์ ํ ๋ถ๋ถ์ด ์ ๋ค!