Skip to content

Instantly share code, notes, and snippets.

@kipsong133
Created August 19, 2021 08:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kipsong133/41a39362320963bdab8a4bb3c33a980c to your computer and use it in GitHub Desktop.
Save kipsong133/41a39362320963bdab8a4bb3c33a980c to your computer and use it in GitHub Desktop.
메멘토 패턴 예제
import UIKit
// 1 Originator 를 정의한다.
class Game {
public var level = 0
public var score = 0
/// 레벨을 설정하는 메소드
public func setLevel(level: Int) {
self.level = level
}
/// 점수를 설정하는 메소드
public func setScore(score: Int) {
self.score = score
}
/// 데이터를 저장하는 메소드
public func makeSnapshot() -> SaveData {
print("Level : \(self.level), Score: \(self.score) 를 저장합니다.")
return SaveData(originator: self)
}
public func printCurrentState() {
print("현재 Level : \(self.level), 현재 Score: \(self.score)")
}
}
// 2 Memento 클래스를 정의한다.
class SaveData {
var originator: Game
var level: Int = 0
var score: Int = 0
init(originator: Game) {
self.originator = originator
self.level = originator.level
self.score = originator.score
}
/// 입력받은 값을 Originator에 복원하는 메소드
func load() {
self.originator.setLevel(level: self.level)
self.originator.setScore(score: self.score)
}
}
// 3 Caretaker를 정의한다.
class GameDataSystem {
private var history: [SaveData] = []
/// Array<Memento Type> 에 추가하는 메소드
func save(snapshot: SaveData) {
self.history.append(snapshot)
}
func load() {
if let snapshot = self.history.popLast() {
print("가장 최근 정보를 불러옵니다\n")
snapshot.load()
} else {
print("저장 기록이 없습니다.\n")
}
}
}
let originator = Game()
let caretaker = GameDataSystem()
originator.setLevel(level: 5)
originator.setScore(score: 3)
let memento = originator.makeSnapshot()
caretaker.save(snapshot: memento)
// 게임을 하다가 레벨과 점수가 이전 저장했을 때 보다 줄어든 경우 -> 상태정보변경
originator.setLevel(level: 1)
originator.setScore(score: 1)
originator.printCurrentState()
// 복구하여 레벨과 점수 정보를 복구한다.
caretaker.load()
originator.printCurrentState()
caretaker.load()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment