- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- swift
- 프로그래머스
- programmer
- 스위프트
- 정렬 알고리즘
- Algorithm
- 알고리즘
- 다트
- programmers
- 감성에세이
- 코딩테스트
- 스위프트디자인패턴
- datastructure
- coding test
- 정렬
- 코테
- 프로그래머스 swift
- Design Pattern
- swift split
- sort
- 정렬알고리즘
- swift 코딩테스트
- dart
- rxswift
- 디자인패턴
- 프로그래머스 level1
- swift 알고리즘
- 프로그래머스 레벨2
- 디자인 패턴
- 자료구조
Bill Kim's Life...
[디자인패턴] Memento(메멘토) : 객체의 상태를 저장하고 복원 본문
디자인패턴에의 Memento(메멘토)에 대하여 Swift를 기반으로 하여 살펴봅니다.
#. 구독 대상
- 컴퓨터 및 소프트웨어 공학과 관련자
- 소프트웨어 관련 종사자
- 기타 컴퓨터 공학에 관심이 있으신 분
- 디자인패턴의 개념을 잡고 싶으신 분
- 기타 소프트웨어 개발과 지식에 관심이 있으신 모든 분들
- Swift 언어를 활용하여 디자인패턴을 공부해보고 싶으신 분들
Memento(메멘토)
Memento(메멘토) 패턴은 객체의 상태를 저장하고 복원할 수 있는 행동 디자인 패턴입니다.
기본 오리지날 객체는 본래의 기능에만 충실하고 상태 정보에 대한 관리를 메멘토 객체에게 전담하여 상태를 저장하고 복원할 수 있게 한다.
구조
Memento(메멘토) 패턴을 UML로 도식화하면 아래와 같습니다.
Originator : 상태값을 가지고 있고 객체의 본연의 기능만을 수행하며 저장 및 복원에 대한 작업은 Memento 객체에게 넘기는 객체
Memento : Originator 객체의 스냅샷 역할을 하는 값 객체이다. 메멘토 데이터는 생성장를 통해서 한번만 전달하는 것이 일반적입니다.
ConcreteMemento : Memento 객체를 상속받아 메멘토 객체가 가진 데이터에 대한 초기화를 진행하는 클래스 객체
Caretaker(Client) : Originator 객체에 대한 상태가 언제 바뀌고 저장되었는지를 알고 있는 객체, 또한 스냅샷 리스트를 가지고 있고 복원을 할 경우 가장 최상위의 Originator 상태로 복원을 진행하는 객체
Implementation
class Originator {
private var state: String
init(state: String) {
self.state = state
print("Originator: My initial state is: \(state)")
}
func doSomething() {
print("Originator: I'm doing something important.")
state = generateRandomString()
print("Originator: and my state has changed to: \(state)")
}
private func generateRandomString() -> String {
return String(UUID().uuidString.suffix(4))
}
func save() -> Memento {
return ConcreteMemento(state: state)
}
func restore(memento: Memento) {
guard let memento = memento as? ConcreteMemento else { return }
self.state = memento.state
print("Originator: My state has changed to: \(state)")
}
}
protocol Memento {
var name: String { get }
var date: Date { get }
}
class ConcreteMemento: Memento {
private(set) var state: String
private(set) var date: Date
init(state: String) {
self.state = state
self.date = Date()
}
var name:String { return state + " " + date.description.suffix(14).prefix(8) }
}
class Caretaker {
private lazy var mementos = [Memento]()
private var originator: Originator
init(originator: Originator) {
self.originator = originator
}
func backup() {
print("\nSaving Originator's state...\n")
mementos.append(originator.save())
}
func undo() {
guard !mementos.isEmpty else { return }
let removedMemento = mementos.removeLast()
print("Restoring state to: " + removedMemento.name)
originator.restore(memento: removedMemento)
}
func showHistory() {
print("Here's the list of mementos:\n")
mementos.forEach({ print($0.name) })
}
}
let originator = Originator(state: "Super-duper-super-puper-super.")
// Originator: My initial state is: Super-duper-super-puper-super.
let caretaker = Caretaker(originator: originator)
caretaker.backup()
// Saving Originator's state...
originator.doSomething()
// Originator: I'm doing something important.
// Originator: and my state has changed to: B147
caretaker.backup()
// Saving Originator's state...
originator.doSomething()
// Originator: I'm doing something important.
// Originator: and my state has changed to: 20B2
caretaker.backup()
// Saving Originator's state...
caretaker.showHistory()
// Super-duper-super-puper-super. 08:22:02
// B147 08:22:02
// 20B2 08:22:02
caretaker.undo()
// Restoring state to: 20B2 08:22:31
// Originator: My state has changed to: 20B2
caretaker.undo()
// Restoring state to: B147 08:22:31
// Originator: My state has changed to: B147
caretaker.undo()
// Caretaker: Restoring state to: Super-duper-super-puper-super. 08:22:31
// Originator: My state has changed to: Super-duper-super-puper-super.
이상으로 Swift를 기반으로하여 Memento(메멘토) 디자인 패턴을 설명하였습니다.
감사합니다.
www.slideshare.net/BillKim8/swift-memento
github.com/billnjoyce/Lectures/tree/master/src/designpatterns
[참고 자료(References)]
[1] Memento in Swift : https://refactoring.guru/design-patterns/memento/swift/example
[2] 메멘토 패턴 (Memento Pattern in Swift) : https://jerome.kr/entry/memento-pattern
[3] Design Patterns in Swift #2: Observer and Memento : https://www.appcoda.com/design-pattern-behavorial/
[4] A Design Pattern Story in Swift – Chapter 17: Memento : http://audreyli.me/2015/07/15/a-design-pattern-story-in-swift-chapter-17-memento/
[5] How to Use the Memento Pattern : https://aruniphoneapplication.blogspot.com/2016/12/the-memento-pattern.html
[6] [Design Pattern] 메멘토(Memento) 패턴 - 디자인 패턴 : https://palpit.tistory.com/205
[7] Design Patterns - Memento Pattern : https://www.tutorialspoint.com/design_pattern/memento_pattern.htm
[8] Design Pattern: Memento Pattern : https://viblo.asia/p/design-pattern-memento-pattern-eW65GDPOKDO
[9] 메멘토 패턴 : https://ko.wikipedia.org/wiki/메멘토_패턴
[10] Memento Design Pattern : https://sourcemaking.com/design_patterns/memento
'CS(컴퓨터 과학) > Design Patterns' 카테고리의 다른 글
[디자인패턴] 디자인패턴의 개요 : 개념 및 목적 그리고 디자인패턴 종류 (0) | 2020.06.12 |
---|---|
[디자인패턴] Chain of Responsibility(책임 연쇄) : 연속적인 핸들러를 통한 요청 처리 및 전달 (0) | 2020.06.12 |
[디자인패턴] Iterator(반복자) : 컬렉션의 순회 동작을 별도의 반복자 객체로 분리 (0) | 2020.06.12 |
[디자인패턴] Visitor(방문자) : 객체의 구조와 기능을 분리, 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장 (0) | 2020.06.12 |
[디자인패턴] Mediator(중재자) : 복잡한 의존 관계와 로직은 캡슐화 (0) | 2020.06.12 |