memento pattern
ケース
オブジェクトの状態を元に戻したいとき
結果
pros
カプセル化を壊さない。
Original class を汚さない
cons
言語によってはnarrow インターフェイス, wideインターフェイスを区別していない
memento objectのコストが高い場合もある
example
class Originator {
func createMemento() -> NarrowMementoProtocol {
let m = Memento()
// m.state = self.state
return m
}
func setMemento(memento: NarrowMementoProtocol) {
guard let m = memento as? NarrowMementoProtocol else { return }
// self.state = m.state
}
}
class CareTaker {
private var mementos: [NarrowMementoProtocol]
func do() {
let originator = Originator()
let memento = originator.createMemento()
mementos.append(memento)
// originator.doSomething
}
func undo() {
let originator = Originator()
let memento = mementos.last // TODO: nil care
originator.setMemento(memento)
// originator.undoSomething
}
}
protocol NarrowMementoProtocol { // empty protocol }
class Memento: NarrowMementoProtocol {
var state: State
}