Created
August 19, 2021 08:37
-
-
Save kipsong133/41a39362320963bdab8a4bb3c33a980c to your computer and use it in GitHub Desktop.
메멘토 패턴 예제
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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