GoF의 디자인 패턴, 상태 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
//
// main.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal func main() {
let player = Player(speed: 0)
player.update(state: StandUpState(player: player))
while true {
print("플레이어 상태: \(player.state?.description ?? "")")
print("속도: \(player.speed) km/h")
print("1: 서기, 2: 앉기, 3: 걷기, 4: 뛰기, 5: 종료")
print("")
let input = readLine()
guard let first = input?.components(separatedBy: " ").first,
let command = Int(first) else {
return
}
switch command {
case 1:
player.state?.standUp()
case 2:
player.state?.sitDown()
case 3:
player.state?.walk()
case 4:
player.state?.run()
default:
print("종료합니다.")
return
}
}
}
main()
//
// Player.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
public class Player {
private(set) var speed: Int
private(set) var state: State?
internal init(speed: Int) {
self.speed = speed
}
internal func update(state: State) {
self.state = state
}
internal func update(speed: Int) {
self.speed = speed
}
internal func talk(message: String) {
print("플레이어: \(message)")
}
}
//
// State.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal protocol State: Loggable {
init(player: Player)
func standUp()
func sitDown()
func walk()
func run()
var player: Player { get }
}
internal protocol Loggable {
var description: String { get }
}
//
// StandUpState.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal class StandUpState: State {
required internal init(player: Player) {
self.player = player
}
internal func standUp() {
self.player.talk(message: "언제 움직일꺼야?")
}
internal func sitDown() {
self.player.update(state: SitDownState(player: self.player))
self.player.talk(message: "앉으니 편하고 좋아요")
}
internal func walk() {
self.player.update(speed: 5)
self.player.update(state: WalkState(player: self.player))
self.player.talk(message: "걷기는 제2의 생각하기다..")
}
internal func run() {
self.player.update(speed: 10)
self.player.update(state: RunState(player: self.player))
self.player.talk(message: "갑자기 뛴다고?")
}
internal let player: Player
}
extension StandUpState: Loggable {
internal var description: String {
"제자리에 서있음"
}
}
//
// SitDownState.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal class SitDownState: State {
required internal init(player: Player) {
self.player = player
}
internal func standUp() {
self.player.update(state: StandUpState(player: self.player))
self.player.talk(message: "일어나자..")
}
internal func sitDown() {
self.player.talk(message: "얼마나 오래 앉아 있을 생각이야")
}
internal func walk() {
self.player.update(state: StandUpState(player: self.player))
self.player.talk(message: "앉아서 어떻게 걷니 일단 일어나자.")
}
internal func run() {
self.player.update(state: StandUpState(player: self.player))
self.player.talk(message: "앉아서 어떻게 뛰니 일단 일어나자.")
}
internal let player: Player
}
extension SitDownState: Loggable {
internal var description: String {
"앉아있음"
}
}
//
// WalkState.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal class WalkState: State {
required internal init(player: Player) {
self.player = player
}
internal func standUp() {
self.player.update(speed: 0)
self.player.update(state: StandUpState(player: self.player))
self.player.talk(message: "멈춰")
}
internal func sitDown() {
self.player.update(speed: 0)
self.player.update(state: SitDownState(player: self.player))
self.player.talk(message: "걷다가 앉다니 엉덩이 까진다.")
}
internal func walk() {
self.player.talk(message: "그래 계속 걷자.")
}
internal func run() {
self.player.update(speed: 20)
self.player.update(state: RunState(player: self.player))
self.player.talk(message: "걷다가 뛰면 속도가 확 오르지!")
}
internal let player: Player
}
extension WalkState: Loggable {
internal var description: String {
"걷는 중"
}
}
//
// RunState.swift
// State
//
// Created by Choiwansik on 2023/02/13.
//
import Foundation
internal class RunState: State {
required internal init(player: Player) {
self.player = player
}
internal func standUp() {
self.player.update(speed: 0)
self.player.update(state: StandUpState(player: self.player))
self.player.talk(message: "뛰다가 섰더니 무릎이 아파")
}
internal func sitDown() {
self.player.update(speed: 0)
self.player.update(state: SitDownState(player: self.player))
self.player.talk(message: "뛰다가 앉으라고? 엉덩이 다까졌다.")
}
internal func walk() {
self.player.update(speed: 8)
self.player.update(state: WalkState(player: self.player))
self.player.talk(message: "속도를 줄일게")
}
internal func run() {
self.player.update(speed: self.player.speed + 2)
self.player.talk(message: "더 빨리 뛰라는 소리지?")
}
internal let player: Player
}
extension RunState: Loggable {
internal var description: String {
"뛰는 중"
}
}
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 현재 상태에 있는 동안 다음 상태로의 [url=https://heardle80s.io]heardle 80s[/url] 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
핵심은 내가 heardle 80s 현재 상태에 있는 동안 다음 상태로의 전환을 국가가 담당한다는 점이다. 즉, 상태는 현재 상태에서 다음 상태로 전환할 때 처리를 담당해야 합니다.
The state pattern is a design pattern in which state is represented as an object, and the object's behavior is adjusted based on the heardle game state. This reduces complex conditional statements and allows you to manage state transitions between objects.